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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:31