Skip to main content
 首页 » 编程设计

python之在多列上使用 pandas groupby 函数

2025年05月04日35jackei

我有一个类似这样的 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 

我想计算给定 Departure 和 Status 的每个唯一 Species1 的出现次数 D C

我想要的输出是:

Species1   RD    RC    DD    DC 
Carlan     2     NaN   1     NaN 
Scival     NaN   2     NaN   1 

请您参考如下方法:

新建一列,是Departure和Status的组合

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 

额外信息

参见 this link有关从各种对象创建新数据框的想法。当您想从单个数据点(例如 (Species1,comb) )创建数据框时,from_items 是您的最佳选择。