如何对Pandas DataFrame中满足特定条件的行合并求和?
解决方法
核心思路是标准化配对后分组求和,彻底避免逐行遍历的低效问题,具体步骤如下:
1. 构造测试数据
先还原你的初始DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': ['x', 'z', 'y', 't', 'y'], 'B': ['y', 't', 'o', 'z', 'x'], 'C': [10, 20, 30, 5, 100] })
2. 标准化配对
给每行的A、B列做排序,生成统一的配对标识,这样(x,y)和(y,x)会被识别为同一组:
# 生成排序后的配对列,确保配对顺序统一 df[['std_A', 'std_B']] = pd.DataFrame(np.sort(df[['A', 'B']], axis=1), index=df.index)
3. 分组求和并还原格式
按标准化后的配对分组,对C列求和,再把列名改回原格式:
# 分组求和 result = df.groupby(['std_A', 'std_B'], as_index=False)['C'].sum() # 重命名列并调整顺序 result = result.rename(columns={'std_A': 'A', 'std_B': 'B'})
如果需要严格保留原始配对的顺序(比如保留先出现的x-y而非y-x),可以用另一种分组方式:
# 生成元组形式的标准化配对作为分组键 df['pair_key'] = df.apply(lambda row: tuple(sorted((row['A'], row['B']))), axis=1) # 分组时保留原始的A、B(取每组第一个出现的配对),同时求和C result = df.groupby('pair_key').agg( A=('A', 'first'), B=('B', 'first'), C=('C', 'sum') ).reset_index(drop=True)
两种方法都能得到你想要的结果,而且都是Pandas矢量化操作,比逐行遍历效率高得多,尤其适合大数据量场景。
内容的提问来源于stack exchange,提问作者Varun Rajasekar
相关产品推荐
相关产品推荐

