基于条件合并两个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
相关产品推荐
相关产品推荐

