如何检测Pandas DataFrame中的反向列并将对应值求和合并
解决方案
核心思路是给每一行的两列组合生成一个不区分顺序的唯一标识,将正向、反向的同组合行分到同一组后聚合求和即可,具体实现如下:
首先构造测试数据:
import pandas as pd df = pd.DataFrame({ 'Col A': ['A', 'C', 'B', 'E'], 'Col B': ['B', 'D', 'A', 'F'], 'Value': [2, 3, 2, 5] })
常规实现(保留原始列出现顺序)
如果需要保留首次出现的列顺序(和你示例的输出完全一致),可以用如下方法:
# 生成不区分顺序的配对键,正反配对会得到相同的元组 df['pair'] = df.apply(lambda x: tuple(sorted([x['Col A'], x['Col B']])), axis=1) # 按配对键分组,求和Value,同时取分组内第一个出现的Col A、Col B result = df.groupby('pair').agg({ 'Col A': 'first', 'Col B': 'first', 'Value': 'sum' }).reset_index(drop=True)[['Col A', 'Col B', 'Value']]
输出result即可得到你需要的结果:
Col A Col B Value 0 A B 4 1 C D 3 2 E F 5
高性能实现(适合大数据量)
如果不需要严格保留原始列顺序,统一按大小排序展示,可以用向量化操作替代apply,性能提升非常明显:
import numpy as np df['min_col'] = np.minimum(df['Col A'], df['Col B']) df['max_col'] = np.maximum(df['Col A'], df['Col B']) result = df.groupby(['min_col', 'max_col']).agg( Value=('Value', 'sum') ).reset_index().rename(columns={'min_col': 'Col A', 'max_col': 'Col B'})
内容的提问来源于stack exchange,提问作者BiGubbs
相关产品推荐
相关产品推荐

