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如下,完全符合预期:
| Source | Dest | Value |
|---|---|---|
| A | B | 11 |
| A | C | 17 |
| D | E | -1 |
| F | G | 1 |
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

