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合并即可:
- 对df1做透视表:将
yyyyww作为索引,event作为列,event_flag作为值,缺失值填充为0并转为整数 - 和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
相关产品推荐
相关产品推荐

