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

Update:10, Oct., 2018
為什麼我想寫這一篇備忘綠
現在 Pandas 作為資料科學中常用的資料預處理及暫時資料儲存的主流套件,因為 Pandas 是源自於 R 的 Dataframe,基本邏輯上差不多,但在某些資料選擇和 group 的時候和 R 不同,記得 pandas 又會忘了 R。再者我常忘東忘西的,不如寫一篇把自己常忘的指令和用法寫出來 ,只要有網路就可以隨手查閱了。
把 Dataframe 轉成 2D numpy array
df.valuesData select (資料選擇)
- Select as dictionary (column)
要選擇所需的資料有三種做法,第一種就是 dictionary的方法,這種方法較為直觀,如選擇某些column
df[['col1','col2']] #select data of columns of col1 and col2 或是類似屬性的方法,但僅限於拿取單一column
df.mass2. 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 work3. 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) #descendingBelle 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 (合併)
兩個(或以上)dataframe 的接續(concatenation)是指在第一個 Dataframe 的最後一列後接續第二個 datarame。兩個 dataframe 的合併(merge)則是指依”某些”column的值(key columns)來合併,第一個 dataframe 稱為 left Dataframe,第二個 dataframe則稱為 right dataframe, 此合併方法沿襲SQL的語法,所以有inner join(預設), outer join , left outer join, right outer join等之用法。接下來會對 concatenation 和 merge 分別來做介紹。
- concatenation (接續):pandas.concat()
基本的接續的方法如下,
但要注意所生成的 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 還有許多功能是粒子物理實驗和資料科學常用的,我會開第二篇介紹其他有用的功能,先寫到這裡
