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

Pandas中如何用groupby判断两列无序对一致性并计算定向累加值

实现思路

  • 为每条记录分配方向权重:当Source的字典序小于Dest时权重为+1,反之权重为-1
  • 为每条记录生成唯一的无向配对键:将Source和Dest按字典序排序后组成元组,确保X->Y和Y->X的记录对应同一个配对键
  • 用权重乘以Value得到加权值,按配对键分组求和即可得到定向和

完整实现代码

import pandas as pd

# 构造示例DataFrame
data = {
    "Source": ["A", "A", "B", "A", "A", "D", "E", "F"],
    "Dest": ["B", "B", "A", "C", "C", "E", "D", "G"],
    "Value": [10, 7, 6, 12, 5, 5, 6, 1]
}
df = pd.DataFrame(data)

# 生成无向配对键和方向权重
df["pair"] = df.apply(lambda x: tuple(sorted((x["Source"], x["Dest"]))), axis=1)
df["sign"] = df.apply(lambda x: 1 if x["Source"] < x["Dest"] else -1, axis=1)
df["weighted_val"] = df["Value"] * df["sign"]

# 分组求和并拆分配对键为Source和Dest列
df_out = df.groupby("pair")["weighted_val"].sum().reset_index()
df_out[["Source", "Dest"]] = pd.DataFrame(df_out["pair"].tolist(), index=df_out.index)
df_out = df_out.rename(columns={"weighted_val": "Value"})[["Source", "Dest", "Value"]]

print(df_out)

如果需要处理大数据量的DataFrame,可以用以下向量化操作替代apply,运行效率更高:

import numpy as np
df['min_node'] = np.minimum(df['Source'], df['Dest'])
df['max_node'] = np.maximum(df['Source'], df['Dest'])
df['sign'] = np.where(df['Source'] == df['min_node'], 1, -1)
df['weighted_val'] = df['Value'] * df['sign']
df_out = df.groupby(['min_node', 'max_node'])['weighted_val'].sum().reset_index()
df_out = df_out.rename(columns={'min_node':'Source', 'max_node':'Dest', 'weighted_val':'Value'})

结果验证

运行上述代码后得到的df_out如下,完全符合预期:

SourceDestValue
AB11
AC17
DE-1
FG1

内容的提问来源于stack exchange,提问作者Vineet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:18:03