您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Pandas DataFrame的知識點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Pandas DataFrame的知識點(diǎn)有哪些”吧!
DataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引。
DataFrame的創(chuàng)建有多種方式,不過最重要的還是根據(jù)dict進(jìn)行創(chuàng)建,以及讀取csv或者txt文件來創(chuàng)建。這里主要介紹這兩種方式。
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,我們可以在創(chuàng)建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
使用嵌套字典也可以創(chuàng)建DataFrame
,此時外層字典的鍵作為列,內(nèi)層鍵則作為索引:
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
的行索引,列索引以及數(shù)據(jù)值,數(shù)據(jù)值返回的是一個二維的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方法。
該方法中幾個重要的參數(shù)如下所示:
參數(shù) | 描述 |
---|---|
header | 默認(rèn)第一行為columns,如果指定header=None,則表明沒有索引行,第一行就是數(shù)據(jù) |
index_col | 默認(rèn)作為索引的為第一列,可以設(shè)為index_col為-1,表明沒有索引列 |
nrows | 表明讀取的行數(shù) |
sep或delimiter | 分隔符,read_csv默認(rèn)是逗號,而read_table默認(rèn)是制表符\t |
encoding | 編碼格式 |
其他創(chuàng)建DataFrame的方式有很多,比如我們可以通過讀取mysql或者mongoDB來生成,也可以讀取json文件等等,這里就不再介紹。
在DataFrame
的處理中經(jīng)常會遇到軸的概念,這里先給大家一個直觀的印象,我們所說的axis=0即表示沿著每一列或行標(biāo)簽\索引值向下執(zhí)行方法,axis=1即表示沿著每一行或者列標(biāo)簽?zāi)O驁?zhí)行對應(yīng)的方法。
我們可以根據(jù)列名來選取一列,返回一個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
當(dāng)然,在選取數(shù)據(jù)的時候,我們還可以根據(jù)邏輯條件來選?。?/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方法進(jìn)行索引,不過ix在最新的版本中已經(jīng)被廢棄了,如果要是用標(biāo)簽,最好使用loc方法,如果使用下標(biāo),最好使用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
可以使用一個標(biāo)量修改DataFrame
中的某一列,此時這個標(biāo)量會廣播到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,此時會根據(jù)索引進(jìn)行精確匹配:
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進(jìn)行重新索引。對DataFrame進(jìn)行重新索引,可以重新索引行,列或者兩個都修改,如果只傳入一個參數(shù),則會從新索引行:
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
填充數(shù)據(jù)只能按行填充,此時只能對行進(jìn)行重新索引:
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產(chǎn)生影響
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在進(jìn)行算術(shù)運(yùn)算時會進(jìn)行補(bǔ)齊,在不重疊的部分補(bǔ)足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數(shù)據(jù),不過兩個df中都為NA的數(shù)據(jù),該方法不會填充:
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的元素級數(shù)組方法,也可以用于操作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
另一個常見的操作是,將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上。DataFrame的apply方法即可實(shí)現(xiàn)此功能。
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函數(shù)也是可以用的,使用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可以根據(jù)任意軸的索引進(jìn)行排序,并指定升序降序
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也可以按照值進(jìn)行排序:
#按照任意一列或多列進(jìn)行排序 frame.sort_values(by=['a','b']) #輸出 d a b c three 0 1 2 3 one 4 5 6 7
DataFrame
中的實(shí)現(xiàn)了sum、mean、max等方法,我們可以指定進(jìn)行匯總統(tǒng)計(jì)的軸,同時,也可以使用describe函數(shù)查看基本所有的統(tǒng)計(jì)項(xiàng):
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選項(xiàng)來禁用該功能 df.mean(axis=1,skipna=False) #輸出 a NaN b 1.300 c NaN d -0.275 dtype: float64 #idxmax返回間接統(tǒng)計(jì),是達(dá)到最大值的索引 df.idxmax() #輸出 one b two d dtype: object #describe返回的是DataFrame的匯總統(tǒng)計(jì) #非數(shù)值型的與數(shù)值型的統(tǒng)計(jì)返回結(jié)果不同 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
也實(shí)現(xiàn)了corr和cov方法來計(jì)算一個DataFrame的相關(guān)系數(shù)矩陣和協(xié)方差矩陣,同時DataFrame也可以與Series求解相關(guān)系數(shù)。
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用于計(jì)算每一列與Series的相關(guān)系數(shù) frame1.corrwith(frame1['a']) #輸出 a 1.000000 b 0.188742 c 0.483065 dtype: float64
Pandas中缺失值相關(guān)的方法主要有以下三個:
isnull方法用于判斷數(shù)據(jù)是否為空數(shù)據(jù);
fillna方法用于填補(bǔ)缺失數(shù)據(jù);
dropna方法用于舍棄缺失數(shù)據(jù)。
上面兩個方法返回一個新的Series
或者DataFrame
,對原數(shù)據(jù)沒有影響,如果想在原數(shù)據(jù)上進(jìn)行直接修改,使用inplace參數(shù):
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方法如果發(fā)現(xiàn)缺失值,就會進(jìn)行整行刪除,不過可以指定刪除的方式,how=all,是當(dāng)整行全是na的時候才進(jìn)行刪除,同時還可以指定刪除的軸。
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填充缺失值可以統(tǒng)一填充,也可以按列填充,或者指定一種填充方式: 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的知識點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。