最后一次更新日期: 2019/3/21
pandas
是基于numpy
的數據分析庫,提供一些更易用的數據模型和大量高效的統計方法。
使用前先導入模塊:
import pandas as pd
按需導入以下模塊:
import numpy as np
import matplotlib.pyplot as plt
1. 索引查找
(1). 索引器格式
單值選?。?code>[value,...]
多值選?。?code>[[value1,value2],...]
范圍選?。?code>[start:end:step,...]
start
表示區間的開始,默認值0,end
表示區間的結束(不包含),默認值等于軸長度,step
表示選取的步長,默認值1,采用默認值的參數可以省略,[:,...]
表示對應軸方向上全部選取。
pandas中索引器的格式與numpy差不多,但用法有區別。pandas除了numpy的位置索引,還增加了標簽索引,雖然可以對Series
和DataFrame
直接使用索引器,但用法被嚴格限制,建議改用iloc
和loc
方法進行索引。
(2). 直接索引
In [157]: df=pd.DataFrame(np.arange(1,10).reshape((3,3)),columns=['col1','col2','col3'],index=['row1','row2','row3'])
In [158]: df[0:3:2]
Out[158]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
In [161]: df['row1':'row3':2]
Out[161]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
In [162]: df['col2']
Out[162]:
row1 2
row2 5
row3 8
Name: col2, dtype: int32
In [163]: df[['col1','col3']]
Out[163]:
col1 col3
row1 1 3
row2 4 6
row3 7 9
In [168]: df['col2'][1:3]
Out[168]:
row2 5
row3 8
Name: col2, dtype: int32
直接索引提供了有限的幾種使用方式:按行位置進行索引切片、按行標簽進行索引切片、按列標簽取列、按列標簽列表取多列、布爾索引篩選行、索爾索引篩選元素等。
一次索引器只能使用一種方式,不能行列同時操作,如有需要,可進行連續索引。
(3). loc和iloc索引
In [169]: df.loc['row1','col1']
Out[169]: 1
In [170]: df.loc['row1':'row3':2,'col1':'col3':2]
Out[170]:
col1 col3
row1 1 3
row3 7 9
In [185]: df.iloc[0,0]
Out[185]: 1
In [186]: df.iloc[0:3:2,0:3:2]
Out[186]:
col1 col3
row1 1 3
row3 7 9
loc
專用于標簽索引,iloc
專用于位置索引,索引器可接收單值、列表、范圍、布爾索引,可同時索引行和列。
(4). 布爾索引
In [190]: df>5
Out[190]:
col1 col2 col3
row1 False False False
row2 False False True
row3 True True True
In [191]: df[df>5]
Out[191]:
col1 col2 col3
row1 NaN NaN NaN
row2 NaN NaN 6.0
row3 7.0 8.0 9.0
In [192]: df['col1']>2
Out[192]:
row1 False
row2 True
row3 True
Name: col1, dtype: bool
In [193]: df.loc[df['col1']>2]
Out[193]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
In [196]: df.loc[df['col1']>2,df.iloc[1]>5]
Out[196]:
col3
row2 6
row3 9
In [208]: df.iloc[df['col1'].values>2]
Out[208]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
布爾索引是一種比較特殊的索引,通過對pandas或numpy的數據模型進行邏輯運算得到,與源數據結構相同,數據類型為bool
,用于標識每個元素是否符合邏輯運算的條件。在索引器中使用布爾索引可以篩選出符合條件的數據。
在直接索引時,二維布爾索引可以用于篩選DataFrame
的元素,形狀不變,不符合條件的元素會被替換為NaN
,這一點和numpy不一樣,numpy進行同樣形式的篩選時會將符合條件的元素構造為新的一維數組返回;一維布爾索引只可以用于篩選行數據;
在使用loc
索引時,不能使用二維布爾索引,只能針對每個軸使用一維布爾索引,并且必須是由Series
運算得到的帶有標簽索引的布爾索引;
在使用iloc
索引時,同樣不能使用二維布爾索引,只能針對每個軸使用一維布爾索引,并且必須是由一維ndarray
運算得到的不含標簽索引的布爾索引(Series.values
可得到對應的ndarray
)。
(5). 指定值查找
In [141]: df=pd.DataFrame({'a':[np.nan,1,2],'b':[3,np.nan,4]})
In [142]: df
Out[142]:
a b
0 NaN 3.0
1 1.0 NaN
2 2.0 4.0
In [143]: df.isin([2,3])
Out[143]:
a b
0 False True
1 False False
2 True False
In [144]: df.isna()
Out[144]:
a b
0 True False
1 False True
2 False False
isin
方法用于查找存在于指定列表中的值,isna
方法用于查找NaN值,兩方法都會返回布爾索引,通常結合索引器使用。
2. 表連接
pandas提供了類似于sql的join
、merge
、concat
方法進行表連接。
(1). 索引連接
In [227]: df1=pd.DataFrame([[1,2],[3,4]],columns=['col1','col2'],index=[1,0])
In [228]: df2=pd.DataFrame([[5,6],[7,8]],columns=['col3','col4'],index=[0,1])
In [229]: df1.join(df2,how='inner')
Out[229]:
col1 col2 col3 col4
1 1 2 7 8
0 3 4 5 6
join
方法根據索引進行表連接,how
參數指定連接方式,有inner
內連接、outer
外連接、left
左連接、right
右連接 這幾種,默認為left
。
此處的join
和sql中的join并不一樣。
(2). 鍵連接
In [233]: df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
In [234]: df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
In [235]: df1.merge(df2)
Out[235]:
col1 col2 col3
0 1 4 1
1 2 5 2
In [237]: df1.merge(df2,how='left',left_on='col1',right_on='col3')
Out[237]:
col1 col2_x col2_y col3
0 1 4 4.0 1.0
1 2 5 5.0 2.0
2 2 5 7.0 2.0
3 3 6 NaN NaN
merge
方法根據指定鍵(列)進行表連接,通過on
參數(相同鍵)或left_on
和right_on
參數(不同鍵)指定,默認會將兩表中都存在的鍵作為連接鍵;how
參數指定連接方式,有inner
內連接、outer
外連接、left
左連接、right
右連接 這幾種,默認為inner
。
該方法才是sql中join的等效方法。
(3). 拼接
In [239]: df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
In [240]: df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
In [241]: pd.concat([df1,df2])
Out[241]:
col1 col2 col3
0 1.0 4 NaN
1 2.0 5 NaN
2 3.0 6 NaN
0 NaN 4 1.0
1 NaN 5 2.0
2 NaN 7 2.0
In [242]: pd.concat([df1,df2],join='inner')
Out[242]:
col2
0 4
1 5
2 6
0 4
1 5
2 7
In [243]: pd.concat([df1,df2],axis=1)
Out[243]:
col1 col2 col2 col3
0 1 4 4 1
1 2 5 5 2
2 3 6 7 2
用于拼接表,等效于sql中的union all。
axis
參數指定用于拼接的軸,默認0;join
參數指定其他軸的處理方式,inner
表示只返回都存在的項,outer
表示全部返回,默認outer
。
拼接后的結果表中可能會有行索引或列索引上的重復,可以視需要重整索引。