如何合并含相同唯一元素集合的DataFrame行并聚合数值列?
合并DataFrame中元素集合相同的行并聚合数值
问题场景
现有一个Python DataFrame,A列是逗号分隔的字符串,B列对应数值。需要合并那些字符串拆分后的**元素集合完全相同(不考虑顺序)**的行,并对B列的数值求和。
原DataFrame:
import pandas as pd df = pd.DataFrame([['Organic Search, Direct', 171], ['Organic Search, Direct, Not Found', 3], ['Direct, Organic Search', 389], ['Direct, Organic Search, Not Found', 8]], columns=['A', 'B'])
期望结果:
df_result = pd.DataFrame([['Direct, Organic Search',560], ['Direct, Organic Search, Not Found',11]], columns = ['A','B'])
解决方法
你的思路完全可行——通过生成标准化的分组键来识别元素集合相同的行,具体实现如下:
- 对A列的每个字符串,拆分后按字母顺序排序,再重新拼接成统一格式的字符串,以此作为分组的唯一标识
- 按这个分组键对DataFrame分组,对B列求和
- 按需保留原始格式的A列或者使用标准化后的字符串作为结果的A列
代码实现(保留原始A列格式)
# 生成分组键:拆分字符串→排序→重新拼接 df['group_key'] = df['A'].apply(lambda x: ', '.join(sorted(x.split(', ')))) # 分组聚合:取每组第一个原始A值,对B列求和 result = df.groupby('group_key').agg( A=('A', 'first'), B=('B', 'sum') ).reset_index(drop=True) print(result)
代码实现(使用标准化后的A列)
如果希望结果的A列是排序后的统一格式,直接用分组键作为A列即可:
result = df.groupby(df['A'].apply(lambda x: ', '.join(sorted(x.split(', ')))))['B'].sum().reset_index().rename(columns={'index': 'A'})
代码说明
x.split(', '):将逗号分隔的字符串拆分为元素列表sorted():对列表按字母顺序排序,确保元素集合相同的字符串生成一致的分组键', '.join():将排序后的列表重新拼接为字符串,作为分组的唯一标识groupby().agg():按分组键聚合,完成数值求和与列值提取
内容的提问来源于stack exchange,提问作者Shreyash
相关产品推荐
相关产品推荐

