Pandas-DataFrame基礎(chǔ)知識(shí)點(diǎn)總結(jié)

1、DataFrame的創(chuàng)建

DataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu)诱贿,它含有一組有序的列娃肿,每列可以是不同的值。DataFrame既有行索引珠十,也有列索引料扰,它可以看作是由Series組成的字典,不過(guò)這些Series公用一個(gè)索引焙蹭。
DataFrame的創(chuàng)建有多種方式晒杈,不過(guò)最重要的還是根據(jù)dict進(jìn)行創(chuàng)建,以及讀取csv或者txt文件來(lái)創(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時(shí)指定索引的值:

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粪般,此時(shí)外層字典的鍵作為列,內(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來(lái)訪問(wèn)DataFrame的行索引,列索引以及數(shù)據(jù)值凡橱,數(shù)據(jù)值返回的是一個(gè)二維的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方法小作。該方法中幾個(gè)重要的參數(shù)如下所示:

參數(shù) 描述
header 默認(rèn)第一行為columns,如果指定header=None稼钩,則表明沒(méi)有索引行顾稀,第一行就是數(shù)據(jù)
index_col 默認(rèn)作為索引的為第一列,可以設(shè)為index_col為-1变抽,表明沒(méi)有索引列
nrows 表明讀取的行數(shù)
sep或delimiter 分隔符础拨,read_csv默認(rèn)是逗號(hào),而read_table默認(rèn)是制表符\t
encoding 編碼格式

其他創(chuàng)建DataFrame的方式有很多绍载,比如我們可以通過(guò)讀取mysql或者mongoDB來(lái)生成诡宗,也可以讀取json文件等等,這里就不再介紹击儡。

2塔沃、DataFrame軸的概念

在DataFrame的處理中經(jīng)常會(huì)遇到軸的概念欢摄,這里先給大家一個(gè)直觀的印象庸疾,我們所說(shuō)的axis=0即表示沿著每一列或行標(biāo)簽\索引值向下執(zhí)行方法,axis=1即表示沿著每一行或者列標(biāo)簽?zāi)O驁?zhí)行對(duì)應(yīng)的方法。

3拍鲤、DataFrame一些性質(zhì)

索引背稼、切片
我們可以根據(jù)列名來(lái)選取一列兼砖,返回一個(gè)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ù)的時(shí)候,我們還可以根據(jù)邏輯條件來(lái)選戎瓢埂:

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提供了專(zhuān)門(mén)的用于索引DataFrame的方法冒窍,即使用ix方法進(jìn)行索引,不過(guò)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ù)
可以使用一個(gè)標(biāo)量修改DataFrame中的某一列儒飒,此時(shí)這個(gè)標(biāo)量會(huì)廣播到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

也可以使用一個(gè)列表來(lái)修改谬莹,不過(guò)要保證列表的長(zhǎng)度與DataFrame長(zhǎng)度相同:

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

可以使用一個(gè)Series,此時(shí)會(huì)根據(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方法對(duì)DataFrame進(jìn)行重新索引桩了。對(duì)DataFrame進(jìn)行重新索引附帽,可以重新索引行,列或者兩個(gè)都修改井誉,如果只傳入一個(gè)參數(shù)士葫,則會(huì)從新索引行:

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ù)只能按行填充,此時(shí)只能對(duì)行進(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) 報(bào)錯(cuò)

丟棄指定軸上的值
可以使用drop方法丟棄指定軸上的值送悔,不會(huì)對(duì)原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)算時(shí)會(huì)進(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方法填充N(xiāo)A數(shù)據(jù)爪模,不過(guò)兩個(gè)df中都為NA的數(shù)據(jù)欠啤,該方法不會(huì)填充:

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的元素級(jí)數(shù)組方法,也可以用于操作Pandas對(duì)象:

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

另一個(gè)常見(jiàn)的操作是屋灌,將函數(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

元素級(jí)的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

排序和排名
對(duì)于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

匯總和計(jì)算描述統(tǒng)計(jì)
DataFrame中的實(shí)現(xiàn)了sum祠丝、mean、max等方法,我們可以指定進(jìn)行匯總統(tǒng)計(jì)的軸除嘹,同時(shí)写半,也可以使用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會(huì)被自動(dòng)排除,可以使用skipna選項(xiàng)來(lái)禁用該功能
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方法來(lái)計(jì)算一個(gè)DataFrame的相關(guān)系數(shù)矩陣和協(xié)方差矩陣叠蝇,同時(shí)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

處理缺失數(shù)據(jù)
Pandas中缺失值相關(guān)的方法主要有以下三個(gè):
isnull方法用于判斷數(shù)據(jù)是否為空數(shù)據(jù)年缎;
fillna方法用于填補(bǔ)缺失數(shù)據(jù)悔捶;
dropna方法用于舍棄缺失數(shù)據(jù)铃慷。
上面兩個(gè)方法返回一個(gè)新的Series或者DataFrame,對(duì)原數(shù)據(jù)沒(méi)有影響,如果想在原數(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

對(duì)DataFrame來(lái)說(shuō)犁柜,dropna方法如果發(fā)現(xiàn)缺失值,就會(huì)進(jìn)行整行刪除堂淡,不過(guò)可以指定刪除的方式馋缅,how=all,是當(dāng)整行全是na的時(shí)候才進(jìn)行刪除,同時(shí)還可以指定刪除的軸淤齐。

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末更啄,一起剝皮案震驚了整個(gè)濱河市稚疹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祭务,老刑警劉巖内狗,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異义锥,居然都是意外死亡柳沙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)拌倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赂鲤,“玉大人,你說(shuō)我怎么就攤上這事柱恤∈酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵梗顺,是天一觀的道長(zhǎng)泡孩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寺谤,這世上最難降的妖魔是什么仑鸥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮变屁,結(jié)果婚禮上眼俊,老公的妹妹穿的比我還像新娘。我一直安慰自己粟关,他們只是感情好泵琳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般获列。 火紅的嫁衣襯著肌膚如雪谷市。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天击孩,我揣著相機(jī)與錄音迫悠,去河邊找鬼。 笑死巩梢,一個(gè)胖子當(dāng)著我的面吹牛创泄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播括蝠,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鞠抑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了忌警?” 一聲冷哼從身側(cè)響起搁拙,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎法绵,沒(méi)想到半個(gè)月后箕速,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朋譬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年盐茎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徙赢。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡字柠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狡赐,到底是詐尸還是另有隱情募谎,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布阴汇,位于F島的核電站,受9級(jí)特大地震影響节槐,放射性物質(zhì)發(fā)生泄漏搀庶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一铜异、第九天 我趴在偏房一處隱蔽的房頂上張望哥倔。 院中可真熱鬧,春花似錦揍庄、人聲如沸咆蒿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沃测。三九已至缭黔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒂破,已是汗流浹背馏谨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留附迷,地道東北人惧互。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喇伯,于是被迫代替她去往敵國(guó)和親喊儡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容