Pandas-DataFrame知識點匯總
1、DataFrame的創(chuàng)建
DataFrame
是一種表格型數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引。
DataFrame的創(chuàng)建有多種方式,不過最重要的還是根據(jù)dict進行創(chuàng)建,以及讀取csv或者txt文件來創(chuàng)建。這里主要介紹這兩種方式。
根據(jù)字典創(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 | 默認第一行為columns,如果指定header=None,則表明沒有索引行,第一行就是數(shù)據(jù) |
index_col | 默認作為索引的為第一列,可以設(shè)為index_col為-1,表明沒有索引列 |
nrows | 表明讀取的行數(shù) |
sep或delimiter | 分隔符,read_csv默認是逗號,而read_table默認是制表符\t |
encoding | 編碼格式 |
其他創(chuàng)建DataFrame的方式有很多,比如我們可以通過讀取mysql或者mongoDB來生成,也可以讀取json文件等等,這里就不再介紹。
2、DataFrame軸的概念
在DataFrame
的處理中經(jīng)常會遇到軸的概念,這里先給大家一個直觀的印象,我們所說的axis=0即表示沿著每一列或行標簽\索引值向下執(zhí)行方法,axis=1即表示沿著每一行或者列標簽?zāi)O驁?zhí)行對應(yīng)的方法。
3、DataFrame一些性質(zhì)
索引、切片
我們可以根據(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
當然,在選取數(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方法進行索引,不過ix在最新的版本中已經(jīng)被廢棄了,如果要是用標簽,最好使用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
修改數(shù)據(jù)
可以使用一個標量修改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,此時會根據(jù)索引進行精確匹配:
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進行重新索引,可以重新索引行,列或者兩個都修改,如果只傳入一個參數(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ù)只能按行填充,此時只能對行進行重新索引:
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
算術(shù)運算
DataFrame在進行算術(shù)運算時會進行補齊,在不重疊的部分補足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
函數(shù)應(yīng)用和映射
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方法即可實現(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ù)任意軸的索引進行排序,并指定升序降序
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
匯總和計算描述統(tǒng)計
DataFrame
中的實現(xiàn)了sum、mean、max等方法,我們可以指定進行匯總統(tǒng)計的軸,同時,也可以使用describe函數(shù)查看基本所有的統(tǒ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選項來禁用該功能 df.mean(axis=1,skipna=False) #輸出 a ? ? ?NaN b ? ?1.300 c ? ? ?NaN d ? -0.275 dtype: float64 #idxmax返回間接統(tǒng)計,是達到最大值的索引 df.idxmax() #輸出 one ? ?b two ? ?d dtype: object #describe返回的是DataFrame的匯總統(tǒng)計 #非數(shù)值型的與數(shù)值型的統(tǒng)計返回結(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
也實現(xiàn)了corr和cov方法來計算一個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用于計算每一列與Series的相關(guān)系數(shù) frame1.corrwith(frame1['a']) #輸出 a ? ?1.000000 b ? ?0.188742 c ? ?0.483065 dtype: float64
處理缺失數(shù)據(jù)
Pandas中缺失值相關(guān)的方法主要有以下三個:
- isnull方法用于判斷數(shù)據(jù)是否為空數(shù)據(jù);
- fillna方法用于填補缺失數(shù)據(jù);
- dropna方法用于舍棄缺失數(shù)據(jù)。
上面兩個方法返回一個新的Series
或者DataFrame
,對原數(shù)據(jù)沒有影響,如果想在原數(shù)據(jù)上進行直接修改,使用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)缺失值,就會進行整行刪除,不過可以指定刪除的方式,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填充缺失值可以統(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
到此這篇關(guān)于Pandas-DataFrame知識點匯總的文章就介紹到這了,更多相關(guān)Pandas-DataFrame內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.7環(huán)境下安裝Anaconda的教程圖解
這篇文章主要介紹了python3.7環(huán)境下安裝Anaconda的教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09python 遺傳算法求函數(shù)極值的實現(xiàn)代碼
今天小編就為大家分享一篇python 遺傳算法求函數(shù)極值的實現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02