我有一个事件发生的数据框,其中日期格式为“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)
如何执行所需的操作而不产生重复的列?
在
.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