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

如何合并列结构一致仅单列不同的Pandas DataFrame?

问题

有两个列结构完全一致的Pandas DataFrame,除Frequency列外其余列值均匹配。需要执行全外连接,要求:

  • 若某列在两个DataFrame中均有值则保留单一有效值
  • 保留两个DataFrame的Frequency值并区分来源
  • 因匹配列数量较多,无需逐个处理匹配列

示例数据

第一个DataFrame:

Gene  GeneID  Frequency
0   AA       1         10
1   BB       2         15
2   CC       3         12

第二个DataFrame:

Gene  GeneID  Frequency
0   AA       1         20
1   DD       4         29

当前代码及结果

import pandas as pd

t1 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 10},
{"Gene": "BB", "GeneID": "2" , "Frequency": 15},
{"Gene": "CC", "GeneID": "3" , "Frequency": 12}]

t2 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 20},
{"Gene": "DD", "GeneID": "4" , "Frequency": 29}]

f1 = pd.DataFrame(t1)
f2 = pd.DataFrame(t2)

m = pd.merge(f1,f2,on=['Gene','Gene'],how='outer')

当前合并结果:

Gene GeneID_x  Frequency_x GeneID_y  Frequency_y
0   AA        1         10.0        1         20.0
1   BB        2         15.0      NaN          NaN
2   CC        3         12.0      NaN          NaN
3   DD      NaN          NaN        4         29.0

期望结果

Gene GeneID  Frequency_x   Frequency_y
0   AA        1         10.0         20.0
1   BB        2         15.0          NaN
2   CC        3         12.0          NaN
3   DD        4         NaN          29.0

已尝试方案

  • 逐个填充匹配列:效率低,不适用于多列场景
  • concat+groupby聚合:无法区分Frequency的来源,不符合需求

解决方案

可以通过以下步骤高效处理,无需逐个指定匹配列:

  1. 提取连接键:自动获取除Frequency外的所有列作为连接键
  2. 执行全外连接:基于连接键合并两个DataFrame,自动区分来源的Frequency列
  3. 合并重复匹配列:用combine_first合并带_x/_y后缀的匹配列,保留有效值
  4. 清理冗余列:删除多余的后缀列,恢复原列名

具体代码如下:

import pandas as pd

t1 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 10},
{"Gene": "BB", "GeneID": "2" , "Frequency": 15},
{"Gene": "CC", "GeneID": "3" , "Frequency": 12}]

t2 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 20},
{"Gene": "DD", "GeneID": "4" , "Frequency": 29}]

f1 = pd.DataFrame(t1)
f2 = pd.DataFrame(t2)

# 自动提取连接键:排除Frequency列
join_keys = [col for col in f1.columns if col != 'Frequency']

# 执行全外连接
merged = pd.merge(f1, f2, on=join_keys, how='outer')

# 批量合并重复的匹配列
for col in join_keys:
    merged[col] = merged[f'{col}_x'].combine_first(merged[f'{col}_y'])
    merged.drop([f'{col}_x', f'{col}_y'], axis=1, inplace=True)

# 调整列顺序(可选,贴合期望格式)
merged = merged[join_keys + ['Frequency_x', 'Frequency_y']]

print(merged)

运行结果

Gene GeneID  Frequency_x  Frequency_y
0   AA      1         10.0         20.0
1   BB      2         15.0          NaN
2   CC      3         12.0          NaN
3   DD      4          NaN         29.0

说明

  • combine_first优先取第一个DataFrame的列值,当值为NaN时自动补充第二个DataFrame的对应值,完美满足"保留单一有效值"的需求
  • 循环批量处理所有匹配列,无需手动逐个指定,适配任意数量的匹配列场景
  • 列顺序调整为可选操作,可根据实际需求决定是否保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:43