[python][科學計算][pandas]簡要使用教程4-查詢與關聯

最后一次更新日期: 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的位置索引,還增加了標簽索引,雖然可以對SeriesDataFrame直接使用索引器,但用法被嚴格限制,建議改用ilocloc方法進行索引。

(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_onright_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。

拼接后的結果表中可能會有行索引或列索引上的重復,可以視需要重整索引。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容