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

如何针对特定场景对两个Pandas DataFrame执行左连接以获得目标结果?

问题解答

为什么出现额外列?

当使用pd.merge按col3左连接时,两个DataFrame都包含col4和col5列。Pandas为了避免重复列名导致的冲突,会自动为来自左表(df1)的重复列添加后缀_x,来自右表(df2)的添加后缀_y,这就是你看到额外列的原因。

如何得到期望的输出?

你的需求是保留df1中已有有效数据的行,同时追加df2中对应col3的行(匹配df1的col1和col2),并自动处理df1中空值的行。可以通过以下步骤实现:

代码实现

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'col1': [1, 11, 111],
    'col2': [2, 22, 222],
    'col3': ['a', 'aa', 'aaa'],
    'col4': [3, 33, None],
    'col5': [4, 44, None]
})

df2 = pd.DataFrame({
    'col3': ['a', 'aa', 'aaa'],
    'col4': [3, 332, 333],
    'col5': [4, 442, 444]
})

# 1. 保留df1中col4/col5非空的有效行
valid_rows_from_df1 = df1.dropna(subset=['col4', 'col5']).copy()

# 2. 将df2与df1的基础信息(col1/col2/col3)关联,得到完整的匹配行
df2_merged_with_meta = pd.merge(df1[['col1', 'col2', 'col3']], df2, on='col3', how='left')

# 3. 合并两个数据集,去重(避免重复行,比如col3='a'的情况),重置索引
result_df = pd.concat([valid_rows_from_df1, df2_merged_with_meta]).drop_duplicates().reset_index(drop=True)

# 4. 按col1排序,让结果与期望格式一致
result_df = result_df.sort_values('col1').reset_index(drop=True)

print(result_df)

输出结果

col1  col2 col3   col4   col5
0     1     2    a    3.0    4.0
1    11    22   aa   33.0   44.0
2    11    22   aa  332.0  442.0
3   111   222  aaa  333.0  444.0

补充说明

  • 如果只需要替换df1中的空值而不追加不同的行,可以使用df1.set_index('col3').combine_first(df2.set_index('col3')).reset_index(),但这种方式不会保留aa对应的两行不同数据,不符合你的需求。
  • drop_duplicates()用于移除重复行(比如col3='a'时,df1和df2的行完全一致),确保结果简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:15:33