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

Pandas中用iterrows合并出现重复列,如何实现目标左连接?

解决Pandas事件数据转列时的重复列问题

问题背景

现有两个DataFrame:

  • df1是事件发生数据,包含yyyyww(周格式日期)、event(事件名称)、event_flag(事件标记,值为1)
  • df2是基础数据,包含yyyyww和col1字段

需要将df1中的event转为df2的列,event_flag作为对应列的布尔值(无事件则填0),实现左连接。但用iterrows循环merge时出现带后缀的重复列,需要解决这个问题。

原始数据代码

import pandas as pd

# df1事件数据
df1 = pd.DataFrame({
    'yyyyww': ['2022-01','2022-02','2022-03', '2022-01','2022-02','2022-03','2022-01','2022-03'],
    'event': ['event1','event1','event1','event2','event2','event3','event4','event4'],
    'event_flag': [1,1,1,1,1,1,1,1,]
})

# df2基础数据
df2 = pd.DataFrame({
    'yyyyww': ['2022-01','2022-02','2022-03'],
    'col1': ['apple','car','banana']
})

期望结果

desired_outcome = pd.DataFrame({
    'yyyyww': ['2022-01','2022-02','2022-03'],
    'col1': ['apple','car','banana'],
    'event1':[1,1,1],
    'event2':[1,1,0],
    'event3':[0,0,1],
    'event4':[1,0,1],
})

原代码问题分析

你用iterrows循环merge的方式,每次循环只处理df1的一行数据,生成一个单行DataFrame再和df2合并。当同一个event对应多个yyyyww时,每次merge都会新增一列同名的event列,Pandas会自动添加_x、_y后缀区分,最终导致重复列。

正确解决方案:用透视表+合并

不需要循环,直接对df1做透视表转换,再和df2合并即可:

  1. 对df1做透视表:将yyyyww作为索引,event作为列,event_flag作为值,缺失值填充为0并转为整数
  2. 和df2左连接:基于yyyyww列合并,保留df2的所有行

完整代码:

# 对df1做透视表转换
df1_pivot = df1.pivot(
    index='yyyyww',
    columns='event',
    values='event_flag'
).fillna(0).astype(int)

# 和df2左连接
result = df2.merge(df1_pivot, on='yyyyww', how='left')

# 查看结果
print(result)

执行后得到的结果和desired_outcome完全一致,且没有重复列。

补充说明

  • 透视表pivot会自动将所有唯一的event转为列,每个yyyyww对应的事件值会正确填充,缺失的事件自动补0
  • 这种方法比循环merge效率高得多,尤其是当数据量较大时,避免了多次循环和merge的性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:22:32