首页 > 解决方案 > 如何根据其他 2 列聚合 pandas 列的计数

问题描述

我有一个数据框,如下图所示。我目前有 2 列显示某人遭受的伤害,旁边的列代表该人错过的比赛(如果他们因受伤缺席比赛,则为 1,如果他们没有因受伤缺席比赛,则为无伤)。在第三列而不是 Nan 我想汇总球员因伤缺席的比赛次数。所以你可以看到球员在第一周有脑震荡并错过了一场比赛,但在接下来的一周内没有。因此,由于脑震荡,他缺席了1场比赛。我希望该行看起来像:

Injury       Game Missed    Games Missed Due To Injury
Concussion       1                (Concussion,1)
Concussion       0                (Concussion,1)
No Injury        No Injury        Nan
Shoulder         1                (Shoulder,1)
Shoulder         No Injury        (Shoulder,1)
Shoulder         1                (Shoulder,2)
Shoulder         1                (Shoulder,3)

我如何在 Pandas 中实现这一点?

谢谢!

标签: pythonpandas

解决方案


用于Series.groupby计算cumsum, 在此使用之前pd.to_numericSeries.fillna 'No Injury' 替换为 '0' 以便转换为整数 ( Series.astype) 以计算累积和。计算总和后,转换为 str 并使用以下方法将其加入 Injury 列Series.str.cat

 missed=pd.to_numeric(df['Game Missed'],errors='coerce').fillna(0).astype(int).groupby(df['Injury']).cumsum()  
df['Games Missed Due To Injury']=( missed.astype(str)
                                         .str.cat(df['Injury'],sep=',')
                                         .mask(df['Injury'].str.contains('No')) )
print(df)

       Injury Game Missed Games Missed Due To Injury
0  Concussion           1               1,Concussion
1  Concussion           0               1,Concussion
2   No Injury   No Injury                        NaN
3    Shoulder           1                 1,Shoulder
4    Shoulder   No Injury                 1,Shoulder
5    Shoulder           1                 2,Shoulder
6    Shoulder           1                 3,Shoulder

请注意,您可以使用所需的掩码:

df['Injury'].str.contains('No')
df['Injury'].eq('No Injury')
df['Injury'].str.contains('No Injury',case=False)

推荐阅读