如何在Python Pandas中合并指定无共同值的行并求和?
解决Pandas合并指定无共同值行并求和的问题
嘿,这个问题其实很好解决!既然groupby()需要一个分组依据才能合并行,那我们可以手动给要合并的行分配相同的分组标签,让groupby()把它们归为一组进行求和。我给你用示例代码一步步演示:
步骤1:构造示例数据集
先模拟你提到的场景,假设我们有如下DataFrame(注意Pandas默认是0索引,所以你说的第3、4行对应索引2、3,第6、7行对应索引5、6):
import pandas as pd # 构造示例数据 data = { '类别': ['甲', '乙', '丙', '丁', '戊', '己', '庚'], '数值1': [10, 20, 30, 40, 50, 60, 70], '数值2': [100, 200, 300, 400, 500, 600, 700] } df = pd.DataFrame(data)
步骤2:创建分组标识
给需要合并的行分配同一个分组ID,其他行用唯一标识避免被合并:
# 生成分组键:指定索引的行归为同一组,其余行单独成组 group_keys = [] for idx in df.index: if idx in [2, 3]: # 对应你说的第3、4行 group_keys.append('合并组1') elif idx in [5, 6]: # 对应你说的第6、7行 group_keys.append('合并组2') else: group_keys.append(f'单独行_{idx}') # 其他行保持独立 # 把分组键加入DataFrame df['分组标识'] = group_keys
如果你想更简洁,也可以用numpy.where来生成分组键:
import numpy as np group_keys = np.where(df.index.isin([2,3]), '合并组1', np.where(df.index.isin([5,6]), '合并组2', df.index.astype(str))) df['分组标识'] = group_keys
步骤3:分组求和并整理结果
用groupby()按分组标识聚合,数值列求和,非数值列可以根据需求选择保留第一个值或拼接:
# 自定义聚合规则:数值列求和,类别列取第一个值 result_df = df.groupby('分组标识').agg({ '类别': 'first', # 如果需要合并类别字符串,可以用', '.join '数值1': 'sum', '数值2': 'sum' }).reset_index(drop=True) print(result_df)
运行后你会得到合并后的结果:第3、4行的数值被求和,第6、7行同理,其他行保持原样。
核心思路总结
groupby()的本质是根据“分组依据”聚合行,当行没有共同值时,我们手动给它们添加相同的分组依据,就能让groupby()识别并合并这些行啦!
内容的提问来源于stack exchange,提问作者Indika Rajapaksha
相关产品推荐
相关产品推荐

