Pandas 中的行合并会导致带有后缀的重复列

问题描述 投票:0回答:1

我有一个事件发生的数据框,其中日期格式为“YYYY-WW”。 各种事件可能发生,有些事件与同一时间范围内的其他事件同时发生。示例数据框如下;

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,]})

我有一个第二个数据框,我想将其左连接到第一个数据框。第二个数据框可能包含比 df1 中包含的日期多得多的日期,但就该问题而言,其日期如下:

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

最终,我想执行左连接,以便 df1 中

event
的值成为 df2 中的附加列标题,df1 中的
event_flag
成为相应列标题下的布尔值,如下所示:

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()
来实现此目的时,我最终得到的结果与期望的结果有些相似,但重复了列,这样我最终得到带有后缀的多个列,如下所示:

for index, row in df1.iterrows():
    index_value = row['event']
    #column_a_value = row['disco']
    yyyyww = row['yyyyww']
    event_flag = row['event_flag']
    #model_data_aggya = model_data_agg.join(pd.DataFrame({f'{index_value}': [column_a_value]}))
    df2 = df2.merge(pd.DataFrame({'yyyyww': [yyyyww],
                                                        f'{index_value}': [event_flag]
                                                        }),
                                           left_on='yyyyww', right_on='yyyyww', how='left')
                                        

df2.fillna(0)

如何执行所需的操作而不产生重复的列?

python python-3.x pandas merge left-join
1个回答
0
投票

.merge
之后,您可以
.pivot
数据框以获得最终形式:

out = (
    df2.merge(df1, on="yyyyww")
    .pivot(index=["yyyyww", "col1"], columns="event", values="event_flag")
    .fillna(0)
    .astype(int)
    .reset_index()
    .rename_axis(columns=None, index=None)
)
print(out)

打印:

    yyyyww    col1  event1  event2  event3  event4
0  2022-01   apple       1       1       0       1
1  2022-02     car       1       1       0       0
2  2022-03  banana       1       0       1       1
© www.soinside.com 2019 - 2024. All rights reserved.