![](/img/trans.png)
[英]In pandas groupby mode use user defined function, apply it to multiple columns and assign the results to new pandas columns
[英]Use pandas groupby function on multiple columns
我有一個類似於以下的DataFrame:
Key Departure Species1 Species2 Status
1 R Carlan Carlan D
1 R Scival Carex C
2 R Carlan Scival D
2 R Scival Bougra C
3 D Carlan Carlan D
3 D Scival Scival C
我想計算C
的D
的給定Departure
和Status
下每個唯一Species1
的出現
我想要的輸出是:
Species1 RD RC DD DC
Carlan 2 NaN 1 NaN
Scival NaN 2 NaN 1
新建一個包含“出發時間”和“狀態”的組合的列
df['comb'] = df.Departure + df.Status
df
# Key Departure Species1 Species2 Status comb
#0 1 R Carlan Carlan D RD
#1 1 R Scival Carex C RC
#2 2 R Carlan Scival D RD
#3 2 R Scival Bougra C RC
#4 3 D Carlan Carlan D DD
#5 3 D Scival Scival C DC
然后,您可以分組:
gb = df.groupby(['Species1', 'comb'])
gb.groups
#{('Carlan', 'DD'): [4],
#('Carlan', 'RD'): [0, 2],
#('Scival', 'DC'): [5],
#('Scival', 'RC'): [1, 3]}
現在將結果組織成一個列表,其中每個元素都是一個元組(column, Series(data, index))
表示新數據幀中的單個數據點
items = [ (key[1], pandas.Series( [len(val)], index=[key[0]] ) )for key,val in gb.groups.items() ]
並從以下各項創建一個新的數據框:
result = pandas.from_items( items)
result
# RC DC DD RD
#Carlan NaN NaN 1 2
#Scival 2 1 NaN NaN
請參閱此鏈接,以獲取有關從各種對象創建新數據框的想法。 當您要根據單個數據點(例如(Species1,comb))創建數據框時, from_items
是最佳選擇。
使用pandas.crosstab()方法。 一行代碼:
pd.crosstab(df.Species1, [df.Departure, df.Status])
結果表:
如果與@dermen的“梳子”列結合使用,
df['comb'] = df.Departure + df.Status
pd.crosstab(df.Species1, df.comb)
你會得到:
如果您真的想要那些'NaN',只需在.replace('0', np.nan)
,就像這樣(假設已經完成了import numpy as np
已經完成):
pd.crosstab(df.Species1, df.comb).replace('0', np.nan)
您可以對多個列使用groupby查詢,並使用.agg函數來計算出現次數:
df.groupby(['Species1', 'Departure', 'Status']).agg(['count'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.