Pandas-DataFrame基礎(chǔ)知識
read_csv 方法
1、DataFrame的創(chuàng)建
DataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值。DataFrame既有行索引亲配,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引吼虎。
DataFrame的創(chuàng)建有多種方式犬钢,不過最重要的還是根據(jù)dict進(jìn)行創(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 | 默認(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文件等等,這里就不再介紹申窘。
2舱沧、DataFrame軸的概念
在DataFrame的處理中經(jīng)常會遇到軸的概念,這里先給大家一個直觀的印象偶洋,我們所說的axis=0即表示沿著每一列或行標(biāo)簽\索引值向下執(zhí)行方法,axis=1即表示沿著每一行或者列標(biāo)簽?zāi)O驁?zhí)行對應(yīng)的方法距糖。
[圖片上傳失敗...(image-612026-1543459077617)]
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
當(dāng)然恩脂,在選取數(shù)據(jù)的時候,我們還可以根據(jù)邏輯條件來選热そ铩:
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
修改數(shù)據(jù)
可以使用一個標(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
算術(shù)運(yùn)算
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
函數(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ù)任意軸的索引進(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
匯總和計算描述統(tǒng)計
DataFrame中的實現(xiàn)了sum、mean罩旋、max等方法,我們可以指定進(jìn)行匯總統(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)計瓜饥,是達(dá)到最大值的索引
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方法用于填補(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
作者:石曉文的學(xué)習(xí)日記
鏈接:http://www.reibang.com/p/8024ceef4fe2
來源:簡書
簡書著作權(quán)歸作者所有回官,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。