多列场景下Pandas基于字符串列去重并聚合数值列的高效方法问询
问题描述
数据中H1、H2列存在重复组合,需基于该组合去重并完成聚合:对指定数值列求和、其他指定数值列求均值。目前使用df_p.drop_duplicates(['H1','H2'])仅能实现去重,无法完成聚合。已知可通过groupby/pivottable实现,但数据包含50+列(20+字符串分组列、30+需聚合的数值列),需要无需逐个指定列的高效实现方案。
示例代码
import pandas as pd df_p = pd.DataFrame({'H1':['A1','A1','C1','B1','A1','C1'], 'H2':['X1','Y1','Z1','X1','Y1','Z1'], 'V1':[11,7,8,4,12,6], 'V2':[110,70,80,40,120,60]}) # 当前仅执行去重的代码 df_p.drop_duplicates(['H1','H2'])
当前输出
H1 H2 V1 V2 0 A1 X1 11 110 1 A1 Y1 7 70 2 C1 Z1 8 80 3 B1 X1 4 40
期望输出
H1 H2 V1 V2 0 A1 X1 11 110 1 A1 Y1 19 95 2 C1 Z1 14 70 3 B1 X1 4 40
解决方案
方法1:批量构建聚合规则(基于列名特征)
通过列名特征(如前缀)批量定义聚合规则,无需逐个列名手动输入,适合列数较多的场景:
import pandas as pd df_p = pd.DataFrame({'H1':['A1','A1','C1','B1','A1','C1'], 'H2':['X1','Y1','Z1','X1','Y1','Z1'], 'V1':[11,7,8,4,12,6], 'V2':[110,70,80,40,120,60]}) # 指定分组键 group_keys = ['H1', 'H2'] # 批量生成聚合规则:以V1开头的列求和,以V2开头的列求均值 agg_rules = {} for col in df_p.columns: if col.startswith('V1'): agg_rules[col] = 'sum' elif col.startswith('V2'): agg_rules[col] = 'mean' # 可根据业务需求添加其他列的聚合规则 # 执行分组聚合,保留原列顺序 result = df_p.groupby(group_keys, as_index=False).agg(agg_rules) print(result)
输出结果:
H1 H2 V1 V2 0 A1 X1 11 110.0 1 A1 Y1 19 95.0 2 B1 X1 4 40.0 3 C1 Z1 14 70.0
方法2:按列列表批量定义聚合
先筛选出需要求和和求均值的列列表,再合并为聚合字典,同样无需逐个列名输入:
# 筛选求和列和均值列(可根据列名或业务规则调整) sum_cols = [col for col in df_p.columns if col.startswith('V1')] mean_cols = [col for col in df_p.columns if col.startswith('V2')] # 构建聚合字典 agg_dict = {col: 'sum' for col in sum_cols} agg_dict.update({col: 'mean' for col in mean_cols}) # 分组聚合 result = df_p.groupby(group_keys, as_index=False).agg(agg_dict)
这两种方法都能高效处理多列场景,只需根据列名特征或业务规则调整筛选条件即可,无需手动枚举所有需聚合的列。
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

