本篇內容主要講解“Pandas DataFrame的知識點有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Pandas DataFrame的知識點有哪些”吧!
DataFrame是一種表格型數據結構,它含有一組有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引。
DataFrame的創建有多種方式,不過最重要的還是根據dict進行創建,以及讀取csv或者txt文件來創建。這里主要介紹這兩種方式。
data = { 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9] } frame = pd.DataFrame(data) frame #輸出 pop state year 0 1.5 Ohio 2000 1 1.7 Ohio 2001 2 3.6 Ohio 2002 3 2.4 Nevada 2001 4 2.9 Nevada 2002
DataFrame的行索引是index,列索引是columns,我們可以在創建DataFrame時指定索引的值:
frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt']) frame2 #輸出 year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 NaN three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 NaN five 2002 Nevada 2.9 NaN
使用嵌套字典也可以創建DataFrame
,此時外層字典的鍵作為列,內層鍵則作為索引:
pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}} frame3 = pd.DataFrame(pop) frame3 #輸出 Nevada Ohio 2000 NaN 1.5 2001 2.4 1.7 2002 2.9 3.6
我們可以用index
,columns
,values
來訪問DataFrame
的行索引,列索引以及數據值,數據值返回的是一個二維的ndarray
frame2.values #輸出 array([[2000, 'Ohio', 1.5, 0], [2001, 'Ohio', 1.7, 1], [2002, 'Ohio', 3.6, 2], [2001, 'Nevada', 2.4, 3], [2002, 'Nevada', 2.9, 4]], dtype=object)
讀取文件生成DataFrame
最常用的是read_csv,read_table方法。
該方法中幾個重要的參數如下所示:
參數 | 描述 |
---|---|
header | 默認第一行為columns,如果指定header=None,則表明沒有索引行,第一行就是數據 |
index_col | 默認作為索引的為第一列,可以設為index_col為-1,表明沒有索引列 |
nrows | 表明讀取的行數 |
sep或delimiter | 分隔符,read_csv默認是逗號,而read_table默認是制表符\t |
encoding | 編碼格式 |
其他創建DataFrame的方式有很多,比如我們可以通過讀取mysql或者mongoDB來生成,也可以讀取json文件等等,這里就不再介紹。
在DataFrame
的處理中經常會遇到軸的概念,這里先給大家一個直觀的印象,我們所說的axis=0即表示沿著每一列或行標簽\索引值向下執行方法,axis=1即表示沿著每一行或者列標簽模向執行對應的方法。
我們可以根據列名來選取一列,返回一個Series:
frame2['year'] #輸出 one 2000 two 2001 three 2002 four 2001 five 2002 Name: year, dtype: int64
我們還可以選取多列或者多行:
data = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four']) data[['two','three']] #輸出 two three Ohio 1 2 Colorado 5 6 Utah 9 10 New York 13 14 #取行 data[:2] #輸出 one two three four Ohio 0 1 2 3 Colorado 4 5 6 7
當然,在選取數據的時候,我們還可以根據邏輯條件來選?。?/strong>
data[data['three']>5] #輸出 one two three four Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15
pandas提供了專門的用于索引DataFrame的方法,即使用ix方法進行索引,不過ix在最新的版本中已經被廢棄了,如果要是用標簽,最好使用loc方法,如果使用下標,最好使用iloc方法:
#data.ix['Colorado',['two','three']] data.loc['Colorado',['two','three']] #輸出 two 5 three 6 Name: Colorado, dtype: int64 data.iloc[0:3,2] #輸出 Ohio 2 Colorado 6 Utah 10 Name: three, dtype: int64
可以使用一個標量修改DataFrame
中的某一列,此時這個標量會廣播到DataFrame的每一行上:
data = { 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9] } frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt']) frame2 frame2['debt']=16.5 frame2 #輸出 year state pop debt one 2000 Ohio 1.5 16.5 two 2001 Ohio 1.7 16.5 three 2002 Ohio 3.6 16.5 four 2001 Nevada 2.4 16.5 five 2002 Nevada 2.9 16.5
也可以使用一個列表來修改,不過要保證列表的長度與DataFrame長度相同:
frame2.debt = np.arange(5) frame2 #輸出 year state pop debt one 2000 Ohio 1.5 0 two 2001 Ohio 1.7 1 three 2002 Ohio 3.6 2 four 2001 Nevada 2.4 3 five 2002 Nevada 2.9 4
可以使用一個Series,此時會根據索引進行精確匹配:
val = pd.Series([-1.2,-1.5,-1.7],index=['two','four','five']) frame2['debt'] = val frame2 #輸出 year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 -1.2 three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 -1.5 five 2002 Nevada 2.9 -1.7
使用reindex方法對DataFrame進行重新索引。對DataFrame進行重新索引,可以重新索引行,列或者兩個都修改,如果只傳入一個參數,則會從新索引行:
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=[1,4,5],columns=['Ohio','Texas','California']) frame2 = frame.reindex([1,2,4,5]) frame2 #輸出 Ohio Texas California 1 0.0 1.0 2.0 2 NaN NaN NaN 4 3.0 4.0 5.0 5 6.0 7.0 8.0 states = ['Texas','Utah','California'] frame.reindex(columns=states) #輸出 Texas Utah California 1 1 NaN 2 4 4 NaN 5 5 7 NaN 8
填充數據只能按行填充,此時只能對行進行重新索引:
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California']) frame.reindex(['a','b','c','d'],method = 'bfill') #frame.reindex(['a','b','c','d'],method = 'bfill',columns=states) 報錯
可以使用drop
方法丟棄指定軸上的值,不會對原DataFrame產生影響
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California']) frame.drop('a') #輸出 Ohio Texas California a 0 1 2 c 3 4 5 d 6 7 8 frame.drop(['Ohio'],axis=1) #輸出 Texas California a 1 2 c 4 5 d 7 8
DataFrame在進行算術運算時會進行補齊,在不重疊的部分補足NA:
df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado']) df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns = list('bde'),index=['Utah','Ohio','Texas','Oregon']) df1 + df2 #輸出 b c d e Colorado NaN NaN NaN NaN Ohio 3.0 NaN 6.0 NaN Oregon NaN NaN NaN NaN Texas 9.0 NaN 12.0 NaN Utah NaN NaN NaN NaN
可以使用fill_value方法填充NA數據,不過兩個df中都為NA的數據,該方法不會填充:
df1.add(df2,fill_value=0) #輸出 b c d e Colorado 6.0 7.0 8.0 NaN Ohio 3.0 1.0 6.0 5.0 Oregon 9.0 NaN 10.0 11.0 Texas 9.0 4.0 12.0 8.0 Utah 0.0 NaN 1.0 2.0
numpy的元素級數組方法,也可以用于操作Pandas對象:
frame = pd.DataFrame(np.random.randn(3,3),columns=list('bcd'),index=['Ohio','Texas','Colorado']) np.abs(frame) #輸出 b c d Ohio 0.367521 0.232387 0.649330 Texas 3.115632 1.415106 2.093794 Colorado 0.714983 1.420871 0.557722
另一個常見的操作是,將函數應用到由各列或行所形成的一維數組上。DataFrame的apply方法即可實現此功能。
f = lambda x:x.max() - x.min() frame.apply(f) #輸出 b 3.830616 c 2.835978 d 2.743124 dtype: float64 frame.apply(f,axis=1) #輸出 Ohio 1.016851 Texas 4.530739 Colorado 2.135855 dtype: float64 def f(x): return pd.Series([x.min(),x.max()],index=['min','max']) frame.apply(f) #輸出 b c d min -0.714983 -1.415106 -0.649330 max 3.115632 1.420871 2.093794
元素級的Python函數也是可以用的,使用applymap方法:
format = lambda x:'%.2f'%x frame.applymap(format) #輸出 b c d Ohio 0.37 -0.23 -0.65 Texas 3.12 -1.42 2.09 Colorado -0.71 1.42 -0.56
對于DataFrame,sort_index可以根據任意軸的索引進行排序,并指定升序降序
frame = pd.DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c']) frame.sort_index() #輸出 d a b c one 4 5 6 7 three 0 1 2 3 frame.sort_index(1,ascending=False) #輸出 d a b c one 4 5 6 7 three 0 1 2 3
DataFrame也可以按照值進行排序:
#按照任意一列或多列進行排序 frame.sort_values(by=['a','b']) #輸出 d a b c three 0 1 2 3 one 4 5 6 7
DataFrame
中的實現了sum、mean、max等方法,我們可以指定進行匯總統計的軸,同時,也可以使用describe函數查看基本所有的統計項:
df = pd.DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two']) df.sum(axis=1) #輸出 one 9.25 two -5.80 dtype: float64 #Na會被自動排除,可以使用skipna選項來禁用該功能 df.mean(axis=1,skipna=False) #輸出 a NaN b 1.300 c NaN d -0.275 dtype: float64 #idxmax返回間接統計,是達到最大值的索引 df.idxmax() #輸出 one b two d dtype: object #describe返回的是DataFrame的匯總統計 #非數值型的與數值型的統計返回結果不同 df.describe() #輸出 one two count 3.000000 2.000000 mean 3.083333 -2.900000 std 3.493685 2.262742 min 0.750000 -4.500000 25% 1.075000 -3.700000 50% 1.400000 -2.900000 75% 4.250000 -2.100000 max 7.100000 -1.300000
DataFrame
也實現了corr和cov方法來計算一個DataFrame的相關系數矩陣和協方差矩陣,同時DataFrame也可以與Series求解相關系數。
frame1 = pd.DataFrame(np.random.randn(3,3),index=list('abc'),columns=list('abc')) frame1.corr #輸出 <bound method DataFrame.corr of a b c a 1.253773 0.429059 1.535575 b -0.113987 -2.837396 -0.894469 c -0.548208 0.834003 0.994863> frame1.cov() #輸出 a b c a 0.884409 0.357304 0.579613 b 0.357304 4.052147 2.442527 c 0.579613 2.442527 1.627843 #corrwith用于計算每一列與Series的相關系數 frame1.corrwith(frame1['a']) #輸出 a 1.000000 b 0.188742 c 0.483065 dtype: float64
Pandas中缺失值相關的方法主要有以下三個:
isnull方法用于判斷數據是否為空數據;
fillna方法用于填補缺失數據;
dropna方法用于舍棄缺失數據。
上面兩個方法返回一個新的Series
或者DataFrame
,對原數據沒有影響,如果想在原數據上進行直接修改,使用inplace參數:
data = pd.DataFrame([[1,6.5,3],[1,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,6.5,3]]) data.dropna() #輸出 0 1 2 0 1.0 6.5 3.0
對DataFrame
來說,dropna方法如果發現缺失值,就會進行整行刪除,不過可以指定刪除的方式,how=all,是當整行全是na的時候才進行刪除,同時還可以指定刪除的軸。
data.dropna(how='all',axis=1,inplace=True) data #輸出 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 2 NaN NaN NaN 3 NaN 6.5 3.0 DataFrame填充缺失值可以統一填充,也可以按列填充,或者指定一種填充方式: data.fillna({1:2,2:3}) #輸出 0 1 2 0 1.0 6.5 3.0 1 1.0 2.0 3.0 2 NaN 2.0 3.0 3 NaN 6.5 3.0 data.fillna(method='ffill') #輸出 0 1 2 0 1.0 6.5 3.0 1 1.0 6.5 3.0 2 1.0 6.5 3.0 3 1.0 6.5 3.0
到此,相信大家對“Pandas DataFrame的知識點有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。