實用但常忘記的Pandas Dataframe常用指令 1

黃坤賢
黃坤賢
Aug 31, 2018 · 8 min read

Tips of Pandas Dataframe

Bertinoro, Itali, 2017

Update:10, Oct., 2018

為什麼我想寫這一篇備忘綠

現在 Pandas 作為資料科學中常用的資料預處理及暫時資料儲存的主流套件,因為 Pandas 是源自於 R 的 Dataframe,基本邏輯上差不多,但在某些資料選擇和 group 的時候和 R 不同,記得 pandas 又會忘了 R。再者我常忘東忘西的,不如寫一篇把自己常忘的指令和用法寫出來 ,只要有網路就可以隨手查閱了。

把 Dataframe 轉成 2D numpy array

df.values

Data select (資料選擇)

  1. Select as dictionary (column)

要選擇所需的資料有三種做法,第一種就是 dictionary的方法,這種方法較為直觀,如選擇某些column

df[['col1','col2']] #select data of columns of col1 and col2  

或是類似屬性的方法,但僅限於拿取單一column

df.mass

2. Select using index (row)

第二種做法是用 row index

df[1:20]

依照某些 column 的值做選擇如下

df[df.density>2.0]

多重條件之選擇

df[(df.density>2.0) & (df.area< 200.0)]

但不可與 dictionary-like 混合使用

df[df.density>2.0, ['col1','col2']] #this won't work

3. Select as 2-D array

第三種做法是類似於 numpy array 的選擇法,通常有三個常用的函式 iloc, loc, ix,建議使用這種方法不容易混淆

  • iloc: 以數字為 index 來做選擇
df.iloc[:10, 2:5]
  • loc: 以 column 名來做選擇
df.loc[df.density>0.5, ['density','weight']]
  • ix: 可混合以數字和 column 名的選擇
df.ix[df.density>0.8,1:3]df.ix[3:, :'density']

Aggregation (集合計算)and Groupby (分群)

  • Simple aggregation

如果需要把集合的資料做如最大值或是總合等計算,如下列的函數便可以使用 max(),min(),mean(),median(),std(),var(),mad(),sum(),count(),prod() .

用法會直接對 dataframe 做運算,預設是對每個 column 分開來做計算,如df.max() 會回傳一個 Series 裡面包含每個 column 的最大值 df.mean()。如果要把每一列的所有 column 值加起來會用 df.sum(axis='columns') 。 (引數axis=’columns’)

  • groupby with aggression function

Dataframe 資料依照某一個 column 值作分群之後,再利用 aggregation function 來計算出該群的集合函數值,以下範例為根據不同的 pid 值(粒子種類),來算出不同的質量平均值

df.groupby('pid')['mass'].mean() #calculate grouped mass mean

另一個常用的是用count()算groupby之後的每種不同類型的事件數

df.groupby(['bpd1','bpd2','bpd3'])['bpd1'].count().sort_values(ascending=False) #descending

Belle 2實驗中,常會需要依照每個事件(event)作分群,再依照 fitting 所得到的 Chi-suqare 值來選擇有著最小 Chi-square 值的候選粒子作為最後的最好事件粒子,因此要做這件事我們要先依事件編號(Run,Event) 做 groupby df.groupby(['Run','Event']) 再來求得最小值,這裡用 transform(aggression) 來返回集合計算所得的”所有“ row 的數量的計算值。最後,再用此返回值和原本的 Chi-square 值比較來求得 index 對照列表(list),再用此 index list 來選擇出所需的 row。code 如下

此處有一點要注意的是,因為他是根據每個 group 的最小 Chi-2 來做比對,假設 group 中有兩個 row 的都一樣的 Chi-2 值也剛好是最小值的話,兩個rows 都會被選出來,不是只有選出來一個。

Concatenation (接續) 與 Merge (合併)

  • concatenation (接續):pandas.concat()

基本的接續的方法如下,

concatenation example 1

但要注意所生成的 dataframe (上面的df3) 的 index 直接從原生的兩個 dataframe 拷貝了 index 過來,因此並無重新排序。如需重新排序的話,如下 (選項 ignore_index=True )

pd.cancat([df1,df2], ignore_index=True) # create a new integer index

也可以指定在接續的時候,是否只需要共同的 columns (類似inner join)ˋ或是指定的 columns, 範例如下

在以上的範例中,df1 和 df2 的 columns 並未完全相同,因為預設的接續是對 column 是 outer join,所以在做接續之後,會有些 row 的 column 直會被填入 NaN (not a number),如範例中的 df3即為如此。df4 則加入了選項 join='inner' ,使得只有共同的 column 才會保留下來,如要特別指定 column 的話可以加入選項 join_axes=['col1','col2'] ,如 df5.

  • merge (合併): pandas.merge()

預設中在執行二個 dataframe 合併時,pandas 會直接尋找兩個 dataframe 共同的 columns 並依據其中的值來合併。
要注意的是不管是左的 dataframe 的某共同 column 有一個值重複了 m 次,在右的 dataframe 中出現了 n 次,在結果的 dataframe 中會有著 m*n 個 rows 在共同 column 有這個值,這是合併的多對多 (many to many)原則,範例如下

如果要指定用哪一個 column 來做合併時的關鍵(key)的時候,如果左右的 Dataframe 要用的 key 的 column 名都相同的話,可以加入選項如 pd.merge(df1,df2,on="major") 。如果,左右兩邊的 column 名不同時,左邊的 Dataframe 的 key 名用 left_on,右邊的 key 名用 right_on 來指定,範例如 pd.merge(df1,df2,left_on="major",right_on="depar").drop("depar",axis=1) ,其中的 drop 把重複的其中一行去掉(這裡去掉 depar)。

另一個要注意的點是這裡的合併都是 inner join ,意思是只有 key 的值在左右兩邊的 column 中皆有才會放入最後的 Dataframe 中。如同 SQL 的 join 依樣,我們可以指定合併的種類(inner join, outer join, left join, right join),只要加入選項如下 pd.merge(df1,df2,how='outer') , pd.merge(df1,df2,how='left') , pd.merge(df1,df2,how='right')

pandas 還有許多功能是粒子物理實驗和資料科學常用的,我會開第二篇介紹其他有用的功能,先寫到這裡

黃坤賢

Written by

黃坤賢

A experimental physicist who likes particle physics, data science, and snowboarding.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade