DataFrame是一個(gè)2維標(biāo)簽的數(shù)據(jù)結(jié)構(gòu),可以把它簡(jiǎn)單的想成Excel表格或SQL Table,它的每一行或者每一列都是一個(gè)Series,所以也可以把它抽象成Series數(shù)組。
一.創(chuàng)建
和Series一樣,DataFrame接受許多不同的類型用于創(chuàng)建DataFrame:
- 字典對(duì)象
- 2維列表,ndarray對(duì)象
- Series對(duì)象
- 其他DataFrame對(duì)象
1. 由字典對(duì)象創(chuàng)建
字典的Key作為DataFrame的列名,字典的Value作為列數(shù)據(jù)。這里,Value可以是列表,字典,或者Series等對(duì)象??梢岳胕ndex參數(shù)指定索引。
dic={'A':[1,2,3,4,5],'B':[3,2,4,5,6]}
d=df(dic)
print(d)
Out[1]:
A B
0 1 3
1 2 2
2 3 4
3 4 5
4 5 6
2. 由二維結(jié)構(gòu)對(duì)象創(chuàng)建
在創(chuàng)建時(shí),我們可以使用columns參數(shù)與index參數(shù)分別指定列名與索引名,但是注意,要與列,行的數(shù)量嚴(yán)格匹配,否則報(bào)錯(cuò)。
list=[[1,2,3,4,5],[3,2,4,5,6],[2,2,2,2,2]]
d=df(list,columns=['a','b','c','d','e'],index=[1,2,3])
print(d)
Out[2]:
a b c d e
1 1 2 3 4 5
2 3 2 4 5 6
3 2 2 2 2 2
3. 由Series對(duì)象創(chuàng)建
該方法可以創(chuàng)建一個(gè)只有一列的DataFrame對(duì)象。
s=[1,2,3,4,5]
d=df(s)
print(d)
Out[3]:
0
0 1
1 2
2 3
3 4
4 5
4. 由其他DataFrame對(duì)象創(chuàng)建
類似于利用Series創(chuàng)建,這里不再贅述。
二. 查找與索引
DataFrame支持的查找方式有很多,主要包括:
- 點(diǎn)字符 :訪問(wèn)列
- 中括號(hào) [ ]
- loc[ ] :基于標(biāo)簽索引,可以批量選取
- iloc[ ] :基于位置索引,可以批量選取
- at[ ] : 基于標(biāo)簽索引,只能選取一個(gè)元素
- iat[ ] : 基于位置索引,只能選取一個(gè)元素
- ix[ ] :loc與iloc的混合體,容易發(fā)生位置與標(biāo)簽沖突的情況,pandas不推薦使用,這里不再介紹
1. 點(diǎn)字符
使用點(diǎn)字符以訪問(wèn)成員變量的方式訪問(wèn)列,一次可以訪問(wèn)一列。這里不推薦使用這種方式,主要是為了避免列名與函數(shù)名或者保留字沖突。
s={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}
d=df(s,index=['a','b','c','d','e'])
print(d.A)
2. 中括號(hào)
使用中括號(hào)訪問(wèn)數(shù)據(jù)是Numpy遺留下來(lái)的方式,pandas雖然支持這種方式,但并不是極力推薦的。
示例數(shù)據(jù)d為:
A B
a 1 6
b 2 7
c 3 8
d 4 9
e 5 10
(1)訪問(wèn)列
- 使用列標(biāo)簽訪問(wèn)單個(gè)列:
d['A'](注意只能用列標(biāo)簽,不可以是列位置序號(hào)) - 使用列列表訪問(wèn)多個(gè)列:
d[['A','B']]
(2)訪問(wèn)行
- 使用索引切片訪問(wèn)多行:
d['a' : 'c'](此處可以使用位置) - 使用布爾表達(dá)式訪問(wèn)多行:
d[d['A']>2] #獲取A列中大于2的所有行
(3)訪問(wèn)塊
使用2個(gè)中括號(hào),一個(gè)處理行,一個(gè)處理列,就可以進(jìn)行塊訪問(wèn)了,且不區(qū)分行[ ]與列[ ]的順序。
舉個(gè)栗子:
print(d [['A','B']] [d['B']>8] )
Out[4]:
A B
d 4 9
e 5 10
這里不要糾結(jié),為什么行可以用切片,而列不可以;為什么列可以用列表,而行卻不可以;我想說(shuō)的是語(yǔ)法就是語(yǔ)法,就是不可以。
3. 使用loc
loc是嚴(yán)格的基于標(biāo)簽的索引方法,即便使用數(shù)字也會(huì)被理解為標(biāo)簽是數(shù)字類型的,而不會(huì)被處理為位置下標(biāo)。若在loc方法中使用位置下標(biāo)會(huì)發(fā)生錯(cuò)誤。如果索引是日期類型,那么可以使用日期字符串,比如'20170912'。另外,如果訪問(wèn)的索引不在數(shù)據(jù)中,那么將報(bào)錯(cuò)。
- loc方法的基本格式:
d.loc[行標(biāo)簽,列標(biāo)簽] #行列同時(shí)篩選
d.loc[:,列標(biāo)簽] #只篩選列
d.loc[行標(biāo)簽] #只篩選行
- 使用loc方法接受以下輸入:
- 單個(gè)標(biāo)簽(可以是數(shù)字)
- 標(biāo)簽列表
- 標(biāo)簽切片
- 布爾類型:判斷大小,isin等
- 函數(shù)
注意:與中括號(hào)不同的是,loc的切片既可以用在行篩選,又可以用在列篩選中。另外,別忘了,標(biāo)簽切片,左閉右閉;位置切片,左閉右開(kāi)。
舉個(gè)例子:
print(d.loc[1:4,'A':'B'])
Out[5]:
A B
1 2 7
2 3 8
3 4 9
4 5 10
再來(lái)一個(gè)例子:
print(d.loc[d.loc[:,'A']>2,d.loc[2]>3])
Out[6]:
B
2 8
3 9
4 10
4. 使用iloc
iloc的用法與loc完全相同,區(qū)別僅在于iloc是嚴(yán)格基于數(shù)字位置下標(biāo)的索引方法。在iloc中,僅可以使用數(shù)字下標(biāo),否則報(bào)錯(cuò)。
使用iloc方法接受以下輸入:
- 位置下標(biāo)
- 位置列表
- 切片
- 布爾
- 函數(shù)
注意:iloc的切片是左閉右開(kāi)的?。。∵@點(diǎn)與loc不同。
print(d.iloc[1:4,0:1])
Out[7]:
A
1 2
2 3
3 4
5. 使用at[ ] & iat[ ]
這兩個(gè)函數(shù)都是通過(guò)行列坐標(biāo)定位到某個(gè)具體元素的,at是基于標(biāo)簽的,iat是基于數(shù)字下標(biāo)的。
d.at[行標(biāo)簽,列標(biāo)簽]
d.iat[行下標(biāo),列下標(biāo)]
三. 添加與插入
1. 插入列
插入列一般適用于插入一列的情況,若是要插入多列,則應(yīng)該數(shù)據(jù)整形,這個(gè)之后會(huì)討論。
- 插入在最后列:直接給新列賦值就好。但是要注意,新列的名字不能與之前已經(jīng)存在的列重復(fù),否則會(huì)覆蓋之前列的數(shù)據(jù)。
s={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}
d=df(s)
d['C']=[2,3,4,5,6]
print(d)
Out[4]:
A B C
0 1 6 2
1 2 7 3
2 3 8 4
3 4 9 5
4 5 10 6
- 插入在其他位置:使用insert()函數(shù)
DataFrame.insert(loc, column, value, allow_duplicates=False)
loc : 插入的位置(從0開(kāi)始)
column : 列名標(biāo)簽字符串
value : 列數(shù)據(jù),可以是Series或者數(shù)組序列
allow_duplicates : False時(shí)列名如果已經(jīng)存在,會(huì)報(bào)錯(cuò)。True則不會(huì)。
s={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}
d=df(s)
d.insert(1,'C',[2,3,4,5,6])
print(d)
Out[5]:
A C B
0 1 2 6
1 2 3 7
2 3 4 8
3 4 5 9
4 5 6 10
2. 插入行
目前沒(méi)有函數(shù)能夠直接處理插入行到指定位置,除非分割再合并,我們將在數(shù)據(jù)整形介紹。下面我們看一下如何添加一行在末尾。
- 直接賦值:
由于中括號(hào)[ ]只能選擇列,所以在選擇行時(shí),我們使用loc與iloc。但是,iloc只能給已經(jīng)存在的索引賦值,而loc沒(méi)有限制,所以我們使用loc來(lái)添加一行。可以想象,如果index已經(jīng)存在,那么新的數(shù)據(jù)會(huì)將其覆蓋,所以我們要保證插入的索引是原來(lái)不存在的。
s={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}
d=df(s)
d[5]=pd.Series([1,1],index=['A','B'])
print(d)
Out[6]:
A B
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
5 1 1
這里需要注意,給新行賦值的數(shù)據(jù)可以是數(shù)組序列,也可以是Series。若為Series,則必須保證Series的索引與原數(shù)據(jù)的列名相對(duì)應(yīng),否則由于自動(dòng)對(duì)齊性質(zhì),將插入nan。
- 使用append()函數(shù):
DataFrame.append(data, ignore_index=False, verify_integrity=False, sort=None)
該函數(shù)可以在末尾添加一行,添加的數(shù)據(jù)類型可以是DataFrame,Series,但是會(huì)發(fā)生自動(dòng)對(duì)齊,所以要注意Series的索引,DataFrame的列名與原數(shù)據(jù)對(duì)應(yīng)。
s={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}
d=df(s,index=['a','b','c','d','e'])
d=d.append(pd.Series([1,2],index=['A','B']),ignore_index=True)
print(d)
Out[7]:
A B
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
5 1 2
四. 刪除
常用的刪除函數(shù)主要有2個(gè),drop函數(shù)和pop函數(shù)。drop可以刪除行,也可以刪除列,而pop只能刪除列。
1. drop
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False)
- labels:要?jiǎng)h除的行索引或者列的標(biāo)簽,與axis搭配使用。
- axis:要?jiǎng)h除哪個(gè)軸,0行,1列
- index/columns:分別表示要?jiǎng)h除的行的索引與列的標(biāo)簽,使用它們等價(jià)于使用labels+axis
- levels:多重索引的層級(jí)
- inplace:是否直接修改數(shù)據(jù),F(xiàn)alse表示不修改原數(shù)據(jù),返回一個(gè)新的刪除后的數(shù)據(jù),True則直接在原數(shù)據(jù)中刪除。
d.drop(index=[0,1],inplace=True)
Out[8]:
A B
2 3 8
3 4 9
4 5 10
2. pop
DataFrame.pop(item)
- item: 要彈出的列標(biāo)簽,并且返回該列。
五. 修改
1. 修改某個(gè)值
d.loc[2,'B']=111
Out[9]:
A B
0 1 6
1 2 7
2 3 111
3 4 9
4 5 10
2. 修改某行
- 整行變成同一個(gè)數(shù)字
d.loc[2]=111
Out[10]:
A B
0 1 6
1 2 7
2 111 111
3 4 9
4 5 10
- 整行變成一組數(shù)字
d.loc[2]=[12,23]
Out[11]:
A B
0 1 6
1 2 7
2 12 23
3 4 9
4 5 10
3. 修改某列
同修改某行方法類似。
4. 修改某塊
d.loc[2:3]=111
Out[12]:
A B
0 1 6
1 2 7
2 111 111
3 111 111
4 5 10