如何对DataFrame中唯一双向列组合对应的值求和?
合并DataFrame中双向配对并求和
示例数据准备
先还原你的输入数据:
import pandas as pd import numpy as np df = pd.DataFrame({ 'iso_o': ['ABW', 'AFG', 'NDL', 'NDL', 'ALB', 'ABW'], 'iso_d': ['AFG', 'ABW', 'ALB', 'ARE', 'NDL', 'ARM'], 'value': [5, 100, 17, 4758, 13, 10] })
解决方案
核心思路是标准化双向配对的标识,让ABW-AFG和AFG-ABW被识别为同一组,再对value求和。
方法一:高效批量处理(适合大数据量)
利用numpy对每行的iso_o和iso_d排序,生成统一的配对标识:
# 对每行的两个iso代码排序,生成标准化配对 sorted_iso = np.sort(df[['iso_o', 'iso_d']], axis=1) df['standard_o'] = sorted_iso[:, 0] df['standard_d'] = sorted_iso[:, 1] # 按标准化配对分组求和 result = df.groupby(['standard_o', 'standard_d'])['value'].sum().reset_index() # 重命名列并调整顺序 result.columns = ['iso_o', 'iso_d', 'value']
方法二:逐行处理(逻辑直观)
用apply逐行生成排序后的配对元组,再分组求和:
# 生成排序后的配对元组作为分组键 df['pair'] = df.apply(lambda row: tuple(sorted([row['iso_o'], row['iso_d']])), axis=1) # 分组求和并拆分配对键 result = df.groupby('pair')['value'].sum().reset_index() result[['iso_o', 'iso_d']] = pd.DataFrame(result['pair'].tolist(), index=result.index) # 清理临时列并调整顺序 result = result.drop('pair', axis=1)[['iso_o', 'iso_d', 'value']]
最终结果
执行上述代码后,result即为你需要的输出:
iso_o iso_d value 0 ABW AFG 105 1 ABW ARM 10 2 NDL ALB 30 3 NDL ARE 4758
内容的提问来源于stack exchange,提问作者craszer
相关产品推荐
相关产品推荐

