如何在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 A | Column B | Matched_Column_C |
|---|---|---|
| 1000 | Company1 | 2.1_Info1 |
| 1001 | Company2 | 2.3_Info2 |
| 1002 | Company3 | 2.1_Info1 |
| 1003,1004 | Company4 | 3_Info3,6.1_Info4 |
内容的提问来源于stack exchange,提问作者ZeroCool
相关产品推荐
相关产品推荐

