Python大數據分析之數據處理


# -*- coding: utf-8 -*- #1, read_table()讀取txt文件
from pandas import read_table df=read_table(r'D:\rz.txt',sep=" ") '''查看前3條數據,默認是5條'''
print(df.head(3)) #2, read_csv()讀取csv文件
from pandas import read_csv df=read_csv(r'D:\rz.csv',sep=",") print(df) #3, read_excel()讀取excel文件
from pandas import read_excel #df=read_excel(r'd:\rz.xlsx',sheet_name='Sheet1') #表示讀取第一,第二個sheet頁。
df=read_excel(r'd:\rz.xlsx',sheet_name=[0,1]) print(df) #4, pymysql讀取mysql
import pandas as pd import pymysql dbconn=pymysql.connect(host="", database="", user="", password="", port=3306, charset='utf8') sqlcmd="select * from table" a=pd.read_sql(sqlcmd,dbconn) dbconn.close() b=a.head()  #取前5條數據
print(b) #5,to_csv()導出數據到csv文件
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64]), 'name':Series(['ben','john','jerry'])}) df.to_csv(r'd:\01.csv')  #默認帶上index
df.to_csv(r'd:\02.csv',index=False) #無index


#6,to_excel()導出數據到excel文件
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64]), 'name':Series(['ben','john','jerry'])}) df.to_excel(r'd:\01.xlsx')  #默認帶上index
df.to_excel(r'd:\02.xlsx',index=False) #無index


#7,to_sql導出數據到mysql
from pandas import DataFrame from pandas import Series from sqlalchemy import create_engine #啟動引擎,user:password是用戶和密碼,host:port是ip和端口,databasename是庫名
engine=create_engine("mysql+pymysql://user:password@host:port/
                     databasename?charset=utf8")
df=DataFrame( {'age':Series([26,85,64]), 'name':Series(['ben','john','jerry'])}) #存入mysql
df.to_sql(name='table_name', con=engine, if_exists='append', index=False, index_label=False) #8,重復值的處理
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64,85,85]), 'name':Series(['ben','john','jerry','john','john'])}) #duplicated返回一個布爾型的Series,顯示是否有重復行。
print(df.duplicated())  #默認判斷全部列
print(df.duplicated('name')) #只判斷name列是否重復
print(df.duplicated('age'))  #只判斷age列是否重復
print(df.drop_duplicates('age'))  #去除重復項


#9,缺失值的處理
pandas使用浮點值NaN表示缺失數據,可使用.isnull和.notnull函數判斷缺失。 1、dropna():去除數據結構中值為空的數據行。 2、fillna():用其他數值替代NaN, 如果使用method='pad'參數將使用前一個數據替代NaN, 如果使用method='bfill'參數將使用后一個數據值替代NaN, 如果使用df.mean()參數將使用平均數或者其他描述性統計量來代替NaN, 3、fillna({'列名1':值1, '列名2':值2}),傳入一個字典,對不同列填充不同值。 4、strip():清楚字符型數據首尾的指定字符,默認為空格。lstrip刪除首字符,rstrip刪除尾字符 df['name'].str.strip() #10,字段抽取,slice(start,stop),start是開始位,stop是結束位
from pandas import DataFrame from pandas import Series df=DataFrame( {'序號':Series([1,2,3]), '手機':Series([16612345678,18812346789,19912344567])}) newdf=df['手機'].astype(str) #將數值轉化為字符串
bands=newdf.str.slice(0,3) #抽取手機號前3位,判斷品牌
areas=newdf.str.slice(3,7) #抽取中間4位,判斷號碼地域
tell=newdf.str.slice(7,11) #抽取后4位
print(tell) #11,字段拆分split(sep,n,expand=False) #sep是分隔符,n是分隔后新增的列數,expand為True返回DataFrame,False返回Series
from pandas import DataFrame from pandas import Series df=DataFrame( {'序號':Series([1,2,3]), 'IP':Series(['10.10.10.10','11.11.11.11','12.12.12.12'])}) df['IP'].str.strip() #IP先刪除首尾空格
newdf=df['IP'].str.split('.',3,True)  #按.分割,新增3列
newdf.columns=['IP1','IP2','IP3','IP4'] #設置列名
print(newdf) #12,重置索引,指定某列為索引,便於對其他數據進行操作
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64,85,85]), 'name':Series(['ben','john','jerry','john','john'])}) df1=df.set_index('name') #以name列為新的索引
print(df1) #13、記錄抽取
from pandas import DataFrame from pandas import Series df=DataFrame( {'序號':Series([1,2,3]), '電話':Series([16612345678,18812346789,19912344567]), 'IP':Series(['10.10.10.10','11.11.11.11','12.12.12.12'])}) #按條件抽取,返回的都是DataFrame
print(df[df.電話==16612345678]) print(df[df.電話>16612345678]) print(df[df.電話.between(13400000000,18900000000)]) print(df[df.IP.isnull()]) print(df[df.IP.str.contains('10.',na=False)]) #14、隨機抽樣 #numpy.random.randint(start,end,num) 范圍開始值、結束值、抽樣個數
from pandas import DataFrame from pandas import Series import numpy df=DataFrame( {'age':Series([26,85,64,13,32,45,55,66,77,99]), 'name':Series(['ben','john','jerry','ab','cd','ef', 'gg','kk','rr','tt'])}) r=numpy.random.randint(0,10,3)  #隨機抽取3條記錄,可以有重復,返回一個Series
print(r) print(df.loc[r]) #15,通過索引名抽取數據 #loc[行標簽,列標簽],兩個參數既可以是列表也可以是單個字符,如果都為列表, #則返回的是DataFrame,否則為Series
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64,13,32,45,55,66,77,99]), 'name':Series(['ben','john','jerry','ab','cd','ef', 'gg','kk','rr','tt'])}) print(df.loc[0])  #抽取第1行數據,返回的是Series
print(df.loc[[0,2]])  #抽取第1行和第3行數據,行索引必須是列表的形式
print(df.loc[0:6]) #抽取第1行到第7行的數據
print(df.loc[0:6,'name']) #抽取name列的第1-7行數據
df=df.set_index('age') #更改age列為新的索引
print(df.loc[26:66]) #抽取兩行之間的數據


#16,通過索引號抽取數據 #iloc[行索引號,列索引號]
from pandas import DataFrame from pandas import Series df=DataFrame( {'age':Series([26,85,64,13,32,45,55,66,77,99]), 'name':Series(['ben','john','jerry','ab','cd','ef', 'gg','kk','rr','tt'])}) print(df.iloc[1,0])  #抽取第2行、第1列的值,返回的是單個值
print(df.iloc[[0,2],:])  #抽取第1行和第3行的數據
print(df.iloc[:,1])  #抽取第2列的所有數據

#17,抽取字典數據 #字典的key和value各作為一列
from pandas import DataFrame from pandas import Series d1={'a':'[1,2,3]','b':'[0,1,2]'} a1=DataFrame.from_dict(d1,orient='index') #將字段轉為dataframe
b1=a1.reset_indprint(b1) b1.columns=['key','value'] #將列重命名為key和value
print(b1) #字典的每一個元素作為一列,value的長度相同
d2={'a':[1,2,3],'b':[0,1,2]} a2=DataFrame(d2) print(a2) #字典的每一個元素作為一列,value的長度不同
d3={'a':Series([1,2,3]),'b':Series([1,2,3,4])} a3=DataFrame(d3) print(a3) #18,插入記錄
import pandas as pd df1=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]}) print(df1) #抽取df1的index=1的行,並將第1列、2列、3列賦值為--
df2=pd.DataFrame({df1.columns[0]:"--",df1.columns[1]:"--", df1.columns[2]:"--"},index=[1]) print(df2) #注意df1.loc[:0]不能寫成df1.loc[0],因為前者返回的是DataFrame,后者返回的是Series
df3=pd.concat([df1.loc[:0],df2,df1.loc[1:]]) print(df3) df4=df3.reset_index(drop=True) #重置索引,並刪除新索引
print(df4) #19,修改記錄 #整體替換
df['colname']=[1,2,3]或Series([]) #所有列的單值替換
df.replace('B','A')  #用A替換B #指定列的單值替換,用0替換"體育"列中的"作弊","軍訓"列中的"缺考"
df.replace({'體育':'作弊','軍訓':'缺考'},0) #多值替換,用陳龍替換成龍,用小明替換小李
df.replace({'成龍':'陳龍','小李':'小明'}) #20,交換行或列
from pandas import DataFrame df=DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]}) print(df) hang=[0,2,1] df=df.reindex(hang) #交換行
print(df) lie=['a','c','b'] df=df.reindex(columns=lie) #交換列columns=
print(df) #交換兩行
df.loc[[0,2],:]=df.loc[[2,0],:].values  #交換index=0和index=2兩行數據
print(df) #交換兩列
df.loc[:,['a','b']]=df.loc[:,['b','a']].values print(df) #兩列中間插入一列
df['d']=[4,5,6]  #先增加一列
print(df) df.loc[:,['b','d']]=df.loc[:,['d','b']].values #交換兩列的值 #交換兩列的列名
lie=list(df.columns) i=lie.index('b') j=lie.index('d') lie[i],lie[j]=lie[j],lie[i] df.columns=lie print(df) #21,排名索引 #Series:sort_index(ascending=True)對index進行排序操作,True為升序 #DataFrame:sort_index(axis=0,by=None,ascending=True) 
from pandas import DataFrame df0={'Ohio':[0,6,3],'Texas':[7,4,1],'California':[2,8,5]} df=DataFrame(df0,index=['a','d','c']) print(df) print(df.sort_index()) print(df.sort_index(by='Ohio'))  #by針對某列進行升序排序
print(df.sort_index(by=['California','Texas'])) print(df.sort_index(axis=1))  #axis=1按橫軸排序,axis=0按縱軸排序

#rank(method='average',asceding=True)把對象的values替換成名次(從1到n) #mothod有4個可選項,average、min、max、first
from pandas import Series ser=Series([3,2,0,3],index=list('abcd')) print(ser) print(ser.rank()) print(ser.rank(method='min')) print(ser.rank(method='max')) print(ser.rank(method='first')) #22,數據合並 #記錄合並:df2合並到df1中,為True則index順延
df=pandas.concat([df1,df2],ignore_index=True) df.append(df2,ignore_index=True) #字段合並
from pandas import DataFrame import pandas df=DataFrame({'col1':['133','166','188'], 'col2':['0351','0354','0713'], 'col3':['2190','8513','0615']}) print(df['col1']+df['col2']+df['col3']) #字段匹配
''' merge(x,y,left_on,right_on) x表示第一個數據框,y表示第二個數據框,left_on表示第一個數據庫用於匹配的列 right_on表示第二個數據框用於匹配的列。 ''' df1=DataFrame({'學號':[1,2,3,4,5], '姓名':['張三','李四','王五','趙四','胡胡']}) df2=DataFrame({'學號':[1,2,4,5,6], '電話':['13312345678','16612345678', '18812345678','19912345678','17712345678']}) df3=pandas.merge(df1,df2,left_on='學號',right_on='學號') print(df3) #類似數據庫的右連接,how還有inner,outer,left,right四種
df4=df1.merge(df2,on='學號',how='right') print(df4) #23,數據計算
from pandas import DataFrame import pandas df=DataFrame({'姓名':['小李','小紅','小明','胡胡'], '語文':[90,80,60,20], '數學':[60,70,99,100]}) df['總分']=df['語文']+df['數學'] print(df) print(df.shape) #24,數據分組
''' cut(series,bins,right=True,labels=NULL) series要分組的數據 bins分組的依據數據,必須是從小到大遞增 right分組的時候右邊是否閉合 labels分組的自定義標簽 ''' bins=[min(df.語文)-1,60,70,80,max(df.語文)+1] lab=["不及格","及格","良好","優秀"] demo=pandas.cut(df.語文,bins,right=False,labels=lab) print(demo) #25,日期處理 #日期轉換:to_datetime(string,format) #format格式有%Y,%m,%d,%H,%M,%S 年-月-天-時-分-秒
from pandas import to_datetime from pandas import DataFrame from datetime import datetime df=DataFrame({'no':[1,2,3], 'date':['2016/6/1','2017/6/1','2018/6/1']}) df_dt=to_datetime(df.date,format="%Y/%m/%d") print(df_dt) #日期格式化:
''' apply(func,axis=0,arg=(),**kwds),將函數func應用到DataFrame行或列,axis=0 表示按列運算,axis=1表示按行運算。apply常和lambda函數一起使用。 datetime.strftime(x,format) ''' df_str=df_dt.apply(lambda x:datetime.strftime(x,"%Y/%m/%d")) print(df_str) df1=DataFrame({'ohio':[1,3,6],'texas':[1,4,5],'california':[2,5,8]}, index=['a','c','d']) print(df1) f=lambda x:x.max()-x.min() print(df1.apply(f)) #日期抽取
''' data_dt.dt.property,property有以下幾種: second表示1~60秒 minute表示1~60分 hour表示1~24小時 day表示1~31日 month表示1~12月 year表示年 weekday表示1~7 '''
print(df_dt) print(df_dt.dt.year) print(df_dt.dt.day) print(df_dt.dt.month)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM