Pandas如何先按多字段分组求和再取每个分组内求和排名前2的数据
实现方法
原有代码报错原因
- 第一段代码中,
df.groupby(['A','B'])['C'].sum()返回的是带A、B双层索引的Series,不存在名为A和C的列,后续groupby(['A'])和指定nlargest(2, 'C')都无法找到对应字段 - 第二段代码的lambda表达式中没有指定nlargest的调用对象,写法错误
正确实现代码
写法1:可读性更强的分步写法
# 1. 按A、B组合分组对C求和,直接生成带列的DataFrame sum_df = df.groupby(['A', 'B'], as_index=False)['C'].sum() # 2. 按A分组,每组取C值排名前2的记录,group_keys=False避免生成多余的分组索引 result = sum_df.groupby('A', group_keys=False).apply(lambda x: x.nlargest(2, 'C'))
写法2:链式简写
# 求和后按索引第一层(即A字段)分组取前2,最后重置索引转成标准DataFrame result = df.groupby(['A','B'])['C'].sum().groupby(level=0).nlargest(2).reset_index()
输出效果
拿示例数据运行后,输出结果符合需求:
| A | B | C |
|---|---|---|
| Alabama | a | 100 |
| Alabama | b | 50 |
| ... | ... | ... |
| Wyoming | a.51 | 180 |
| Wyoming | b.51 | 150 |
内容的提问来源于stack exchange,提问作者Tamal
相关产品推荐
相关产品推荐

