You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:53:19