python - Pandas 中的 Iterrows 合并会导致带有后缀的重复列

标签 python pandas merge left-join

我有一个事件发生的数据框,其中日期格式为“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,]})

enter image description here

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

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

enter image description here

最终,我想执行左连接,以便 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],
                         })

enter image description here

但是,当使用 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)

enter image description here

如何执行所需的操作而不导致重复的列?

最佳答案

.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/

相关文章:

python - 根据日期时间值是否在一小时内在 Pandas 中创建新列

HTML 格式的 Python 电子邮件 mimelib

python - 如何在 pandas 中多次提取字符串中存在的单个模式

python-3.x - 从原始列表中查找列表中所有缺失的元素

从合并中返回不匹配的记录

Hadoop - 在两个客户列表中查找匹配的名称

python - Django 自动完成灯列表对象没有属性查询集

python - 学习Python : Store values in dict from stdout

python Tkinter 将文本显示为超链接

python - 在 Python 2.7 中合并多嵌套字典的最佳方法