Pandas多条件合并DataFrame生成D、E列技术问询
Pandas 构造DF3解决方案
需求回顾
- DF3需保留DF1的A、B、C列内容与顺序
- D列:DF2中与DF1的B、C列完全匹配的C值
- E列:DF2中仅B列与DF1匹配、但C列不匹配的所有C值(多值用逗号分隔)
示例数据
import pandas as pd # 示例DF1 df1 = pd.DataFrame({ 'A': [1, 2, 3], 'B': ['x', 'y', 'x'], 'C': [10, 20, 30] }) # 示例DF2 df2 = pd.DataFrame({ 'B': ['x', 'x', 'x', 'y', 'z'], 'C': [10, 30, 40, 25, 50] })
实现代码
步骤1:生成D列(双条件匹配)
通过merge同时匹配B、C两列,直接获取DF2中对应匹配的C值:
df3 = df1.merge(df2.rename(columns={'C': 'D'}), on=['B', 'C'], how='left')
步骤2:生成E列(单B匹配、C不匹配的多值拼接)
先按B分组收集DF2中每个B对应的所有C值,再对DF1每行筛选出排除当前C值的结果并拼接:
# 按B分组,获取每个B对应的C值集合 b_c_groups = df2.groupby('B')['C'].apply(set).reset_index(name='C_set') # 合并分组结果到df3 df3 = df3.merge(b_c_groups, on='B', how='left') # 生成E列:筛选同B但不等于当前C的C值,用逗号分隔 df3['E'] = df3.apply( lambda row: ', '.join(map(str, row['C_set'] - {row['C']})) if pd.notna(row['C_set']) else '', axis=1 ) # 清理临时列,填充D列空值 df3 = df3.drop(columns='C_set') df3['D'] = df3['D'].fillna('')
最终结果
执行后df3的输出为:
A B C D E 0 1 x 10 10 40 1 2 y 20 25 2 3 x 30 30 40
内容的提问来源于stack exchange,提问作者Thenelly
相关产品推荐
相关产品推荐

