我有一个事件发生的数据框,其中日期格式为“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
成为 bool 值在相应的列标题下,如下所示:
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']
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
关于python - Pandas 中的 Iterrows 合并会导致带有后缀的重复列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76908846/