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

基于条件合并两个Pandas DataFrame的简便方法

简化方案:用透视表+合并一步搞定

直接用Pandas的pivot(或pivot_table)先把DataFrame B转成宽表,再和DataFrame A合并,比拆分后逐个合并高效太多。

步骤示例

先构造模拟数据(和你的场景匹配):

import pandas as pd

# 你的DataFrame A
df_a = pd.DataFrame({
    'ID': [1, 2, 3],
    'item': ['苹果', '香蕉', '橙子']
})

# 你的DataFrame B
df_b = pd.DataFrame({
    'ID': [1, 1, 2, 3, 3],
    'flag': ['S1', 'S2', 'S1', 'S2', 'S3'],
    'price ($)': [5, 4.5, 3, 6, 5.8]
})

1. 把DataFrame B转成宽表

用pivot将不同flag对应的price转为单独列:

# 透视操作,ID作为主键,flag转成列,price作为值
df_b_pivot = df_b.pivot(index='ID', columns='flag', values='price ($)').reset_index()

# 给列名加前缀(可选,避免列名太简洁)
df_b_pivot.columns = ['ID'] + [f'price_{flag}' for flag in df_b_pivot.columns[1:]]

如果DataFrame B中存在同一个ID+flag的重复数据,用pivot_table更安全(可以指定聚合规则,比如取均值):

df_b_pivot = df_b.pivot_table(
    index='ID',
    columns='flag',
    values='price ($)',
    aggfunc='mean'  # 重复数据取均值,也可以用sum、first等
).reset_index()
df_b_pivot.columns = ['ID'] + [f'price_{flag}' for flag in df_b_pivot.columns[1:]]

2. 和DataFrame A合并

用左连接保证A的所有数据都保留:

df_c = df_a.merge(df_b_pivot, on='ID', how='left')

最终得到的df_c就是你想要的结果,没有对应flag的商品会显示NaN,符合业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:31:51