Pandas按指定列分组聚合求和并保留原表列结构的实现方法
解决方案
基础场景实现
针对你给出的测试样例,直接按Area分组后对数值列求和即可,代码如下:
import pandas as pd test = pd.DataFrame({'Area': ['Tipperary','Tipperary','Cork','Dublin'], 'Deaths': [11,33,44,55]} ) # as_index=False 保证Area列还是普通列,不会变成索引,保留原表结构 result = test.groupby('Area', as_index=False).sum(numeric_only=True)
运行后得到的结果就是3行数据,其中Tipperary对应的Deaths值为两次数据之和44。
多列场景实现(保留原6列结构)
如果你的DataFrame共有6列,除了需要求和的数值列外还有其他非数值列,且同一个Area对应的非数值列取值唯一,可以通过自定义聚合规则实现需求,两种常用写法如下:
- 手动指定每列聚合规则(适配列少、不同列聚合规则差异大的场景)
# 示例假设6列分别为Area、Province、Population、Deaths、Cases、Recovered result = test.groupby('Area', as_index=False).agg( # 同Area唯一的非数值列取第一个值即可 Province = ('Province', 'first'), # 所有数值列指定求和规则 Population = ('Population', 'sum'), Deaths = ('Deaths', 'sum'), Cases = ('Cases', 'sum'), Recovered = ('Recovered', 'sum') )
- 批量生成聚合规则(适配列多、规则统一的场景,不需要手动逐个写列名)
agg_rules = {} for col in test.columns: if col == 'Area': continue # 数值类型的列自动按求和处理 if pd.api.types.is_numeric_dtype(test[col]): agg_rules[col] = 'sum' # 非数值类型的列自动取同分组第一个值 else: agg_rules[col] = 'first' result = test.groupby('Area', as_index=False).agg(**agg_rules)
注意:如果同一个
Area对应的非数值列存在多个不同取值,可根据业务需要调整非数值列的聚合规则,比如使用lambda x: '|'.join(x.unique())拼接所有唯一值,避免数据丢失。
内容的提问来源于stack exchange,提问作者user16805952
相关产品推荐
相关产品推荐

