pandas(三)DataFrame結(jié)構(gòu)介紹

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ò)。

  1. loc方法的基本格式:
d.loc[行標(biāo)簽,列標(biāo)簽] #行列同時(shí)篩選
d.loc[:,列標(biāo)簽] #只篩選列
d.loc[行標(biāo)簽] #只篩選行
  1. 使用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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容