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

如何在Pandas中基于条件复制列值到另一DataFrame并保留所有记录?

解决Pandas多值匹配并合并的问题

核心思路

由于df1的Column A包含逗号分隔的多值,直接使用merge会因格式不匹配丢失记录。正确的做法是先拆分多值为单独行,匹配后再合并回原结构,全程保留df1的所有记录。

实现代码

import pandas as pd

# 构建示例数据
df1 = pd.DataFrame({
    'Column A': ['1000', '1001', '1002', '1003,1004'],
    'Column B': ['Company1', 'Company2', 'Company3', 'Company4']
})

df2 = pd.DataFrame({
    'Column A': ['1000', '1001', '1002', '1003', '1004', '1005'],
    'Column B': [2.1, 2.3, 2.1, 3, 6.1, 2.2],
    'Column C': ['2.1_Info1', '2.3_Info2', '2.1_Info1', '3_Info3', '6.1_Info4', '2.2_Info5']
})

# 1. 拆分df1的多值列并展开为多行,保留原索引
df1_expanded = df1.assign(Column_A_split=df1['Column A'].str.split(',')).explode('Column_A_split')

# 2. 左连接df2,获取对应Column C的值,确保保留所有df1记录
merged = df1_expanded.merge(
    df2[['Column A', 'Column C']], 
    left_on='Column_A_split', 
    right_on='Column A', 
    how='left'
)

# 3. 按原索引分组,合并同一行匹配到的所有Column C值
result = merged.groupby(merged.index).agg(
    Column_A=('Column A_x', 'first'),
    Column_B=('Column B', 'first'),
    Matched_Column_C=('Column C', lambda x: ','.join(x.dropna().astype(str)))
).reset_index(drop=True)

# 处理无匹配的情况,将空值转为pd.NA(可按需改为空字符串)
result['Matched_Column_C'] = result['Matched_Column_C'].replace('', pd.NA)

print(result)

代码解释

  • 拆分展开:str.split(',')将逗号分隔的字符串拆分为列表,explode把列表中的每个元素转为单独一行,同时保留原df1的索引,为后续合并做准备。
  • 左连接:how='left'保证df1的所有原始记录都被保留,即使没有匹配到df2的记录也不会丢失。
  • 分组合并:通过原索引分组,将同一原始行对应的多个Column C值用逗号拼接,还原回df1的原始行数结构。
  • 空值处理:对没有匹配结果的行,将Matched_Column_C设为pd.NA,便于后续识别和处理。

最终输出

Column AColumn BMatched_Column_C
1000Company12.1_Info1
1001Company22.3_Info2
1002Company32.1_Info1
1003,1004Company43_Info3,6.1_Info4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:55:14