1. 程式人生 > 實用技巧 >python——pandas模組

python——pandas模組

import pandas as pd
import numpy as np


s = pd.Series([1,3,6,np.nan,44,1])
print(s)

# #------------------------------------------DataFrame的建立及基本操作------------------------------------------------------------------
dates = pd.date_range('20200928',periods = 6)       #periods = 6 表示生成6個數據,data_range表示日期型別資料
print(dates) #------pd.DataFrame()------生成DataFrame格式的資料----括號內可傳入矩陣格式和字典格式的資料--- df = pd.DataFrame(np.random.randn(6,4),index = dates,columns = ['a','b','c','d']) print(df) #通過index 設定行的索引值,column設定列的索引值 df1 = pd.DataFrame(np.arange(12).reshape((3,4))) #預設行和列的索引值為從0開始的自然數
print(df1) df2 = pd.DataFrame({'A':1, 'B':pd.Timestamp('20200928'), 'C':pd.Series(1,index = list(range(4)),dtype = 'float32'), 'D':np.array([3]*4,dtype = 'int32'), 'E':pd.Categorical(['test','train','test','train']),
'F':'foo'}) print(df2) #---dtypes---返回每一列的資料型別-------- print(df2.dtypes) #---index---返回行索引值------ print(df2.index) #---column---返回列索引值----- print(df2.columns) #---values---返回DataFrame資料每一行的值----- print(df2.values) #---describe--描述每一列資料---只能描述數字型別的資料--- print(df2.describe) #----T---對DataFrame資料進行類似矩陣的轉置----- print(df2.T) #----sort_index()----對DataFrame按索引進行排序--- print(df2.sort_index(axis = 1,ascending = False)) #通過axis設定對行或佇列進行排序(axis = 1表示對列進行,axis = 0 表示對行進行索引),通過ascending設定正序或倒序,ascending = False表示倒序 #----sort_values()--對DataFrame按值進行排序----- print(df2.sort_values(by = 'E')) #通過by 設定對那一列進行按值排序 #--------------------------------------------------------pandas選擇資料-------------------------------------------------------------- dates = pd.date_range('20200928',periods = 6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index = dates,columns = ['A','B','C','D']) print(df) #---通過下標或索引獲取值---兩種形式--------- print(df.A,df['A']) print(df[0:3],df['20200928':'20200930']) #----loc字尾選擇資料--- print(df.loc['20200929']) #df.loc['20200929]['A']選擇某個值 print(df.loc[:,['A','B']]) #列印A,B兩列所有行的資料,(或者通過df.loc['20200928',['A','B']]列印某行的某幾列) #----通過位置下表選擇資料--------- print(df.loc[3,1]) #返回DataFrame資料中的第三行第一列的資料 print(df.loc[3:5,1:3]) #返回DataFrame資料中第三行到第五行,第一列到第三列的資料,或者通過df.loc[[1,3,5],[1:3]]不連續的選擇某幾行的一到三列 #----通過ix字尾 進行行索引和列索引混合選擇資料---- print(df.ix[:3,['A','B']]) #返回前三行,列索引為‘A'和’B'的資料 #---通過判斷方式(<, >, ==)進行索引---- print(df[df.A > 8]) #返回A列中,數值大於8的資料(df.A鎖定A列) #----------------------------------------------pandas設定值----------------------------------------------------------------------- dates = pd.date_range('20130101',periods = 6) df = pd.DataFrame(np.arange(24).reshape(6,4),index = dates,columns = ['A','B','C','D']) print(df) #---通過下標改值---- df.iloc[2,2] = 1111 print(df) #---通過索引該值----- df.loc['20130103','B'] = 22 #---通過判斷方式鎖定位置進行改值----- df[df.A > 4] = 0 #此方法會將A列中大於0的數的所在行的所有資料改為0,因為此方法是鎖定所有列 print(df) df.A[df.A > 4] = 0 #此方法只將A列中的資料改為0,此方法是鎖定A列(df.A) print(df) #---DataFrame資料中增加列--- # df['F'] = np.nan df['E'] = pd.Series([1,2,3,4,5,6],index = pd.date_range('20130101',periods = 6)) print(df) #-----------------------------------------------------缺失資料的處理------------------------------------------------------------------------ dates = pd.date_range('20130101',periods = 6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index = dates ,columns = ['A','B','C','D']) df.iloc[0,1] = np.nan df.iloc[1,2] = np.nan print(df) #------df.dropna(axis = 0或1 ,how = 'any'或'all')----刪除缺失資料所在行或列---axis = 0表示刪除行,axis = 1表示刪除列,how = any表示只要此行(列)有一個NAN就刪除此行(列), how = all表示此行(列)所有資料都是NAN才刪除此行(列)print print(df.dropna(axis = 0 ,how = 'any')) #------df.fillna(value = )----填充缺失資料---------------- print(df.fillna(value = 0)) #將缺失的資料賦值為0 #------df.isnull()----依次判斷每個位置是否是缺失值---返回布林值--------- print(df.isnull()) print(np.any(df.isnull()) == True) #判斷整個矩陣是否有缺失值,返回布林值 # #-------------------------------------------------------資料的匯入匯出------------------------------------------------------------------- #------pd.read_檔案型別--------讀取檔案---- #------pd.to_檔案型別----------將檔案匯出為指定格式---- df.to_excel('test.xlsx') #----------------------------------------------------------------多個DataFrame資料的合併-------------------------------------------------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d']) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['a','b','c','d']) df3 = pd.DataFrame(np.ones((3,4))*2,columns = ['a','b','c','d']) #此三個資料表頭相同 #-------pd.concat()---橫向或縱向合併資料---------------------- res = pd.concat([df1,df2,df3],axis = 0,ignore_index = True) #ignore_index = True,表示忽略索引,重新進行排列,否則合併後索引為0 1 2 0 1 2...... print(res) #axis = 0 表示按行合併,axis = 1表示按列合併, 預設axis= 0 #--------------------------concat的join引數--------------------------------------------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4]) res = pd.concat([df1,df2],join = 'inner',ignore_index = True) print(res) #此段程式合併的資料表頭不一樣,若按照預設方式(join = outer)合併會形成五列,沒有資料的部分以NAN表示 #此時設定join = inner ,會將相同的部分合並,即合併後資料只有三列(b,c,d) #----------------------join_axes------------------------------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4]) res = pd.concat([df1,df2],axis = 1,join_axes = [df1.index]) #join_axes = [df1.index] 表示按照df1的索引進行資料間的列合併,df2中沒有索引為1的那一列資料顯示為NAN #若不設定此引數,會取兩者索引的並集,即合併後的資料包含四行,缺失的資料用NAN表示 print(res) #-----------------df1.append()方法追加資料------------(append方法不是合併資料,而是往一個裡面追加其他是資料,但並不改變源資料)-------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['a','b','c','d'],index = [2,3,4]) res1 = df1.append(df2,ignore_index = True) print(res1) #此時df1沒有改變,通過引數axis = 1可設定為橫向追加資料 #可以同時追加多個 df3 = pd.DataFrame(np.ones((3,4))*2,columns = ['a','b','c','d'],index = [2,3,4]) res2 = df1.append([df2,df3],ignore_index = True) print(res2) #追加單個數據 s1 = pd.Series([1,2,3,4],index = ['a','b','c','d']) #pd.Series 的作用是將資料標準化 print(s1) res3 = df1.append(s1,ignore_index = True) print(res3) #-----------------------------------------------------------merge方法進行資料合併--------------------------------------------------------- left= pd.DataFrame({'key':['K0','K1','k2','K3'], #鍵作為表頭,值作為資料 'A':['A0','A1','A2','A3'], 'B':['A0','A1','A2','A3']}) right = pd.DataFrame({'key':['K0','K1','K2','K3'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) #-----pd.merge()預設方法的資料合併-------------------------------------------------------- res = pd.merge(left,right,on = 'key') #on = 'key' 表示基於 key 這一列進行合併 print(res) #---pd.merge()進行資料的合併----on、how引數-------------- left= pd.DataFrame({'key1':['K0','K1','k2','K3'], 'key2':['K0','K1','K2','K3'], 'A':['A0','A1','A2','A3'], 'B':['A0','A1','A2','A3']}) right = pd.DataFrame({'key1':['K0','K1','K2','K3'], 'key2':['K0','K1','K2','K3'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) res = pd.merge(left,right,on = ['key1','key2'],how = 'inner') #給引數 on 傳入一個字典,會基於字典內包含的列進行合併 print(res) #how 可傳入引數包括'inner','outer','right','left' #------------------通過merge中的index引數進行合併------------------- left = pd.DataFrame({'A':['A0','A1','A2'], 'B':['B0','B1','B2']}, index = ['K0','K1','K2']) right = pd.DataFrame({'C':['C0','C1','C2'], 'D':['D0','D1','D2']}, index = ['K0','K2','K3']) print(left) print(right) #根據兩個DataFrame的索引進行合併(left_index = True,right_index = True 其功能類似於 on ),並取並集(how = 'outer') res = pd.merge(left,right,left_index = True,right_index = True,how = 'outer') print(res) #-------merge中的suffixes引數------ boys= pd.DataFrame({'k':['K0','K1','K2'],'age':[1,2,3]}) girls= pd.DataFrame({'k':['K0','K0','K3'],'age':[4,5,6]}) print(boys) print(girls) res = pd.merge(boys,girls,on = 'k',suffixes = ['_boys','_girls'],how = 'inner') #dsuffixes = ['_boys','_girls'],為表頭設定字尾名,若不設定,會自動填充_x,_y print(res)