如何针对特定场景对两个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
相关产品推荐
相关产品推荐

