簡體   English   中英

在多列上使用pandas groupby函數

[英]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

我想計算CD的給定DepartureStatus下每個唯一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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM