首页 > 解决方案 > Pandas:在两个不同时间序列中按日期顺序分组在同一 ID 下的列表中显示事件

问题描述

我有两个对应于两个不同事件的数据框。

Event A : 


Person_Id  |   Event_A_Date (yyyy-mm-dd) |  A_Reason (The suffix denotes whether X belongs to event A or B)

1            2020-04-01               X_A            

2            2020-03-29               X_A

1            2020-04-02               Y_A

3            2020-03-28               Z_A

2            2020-04-01               Z_A



Event B :

Person Id  |  Event_B_Date(yyyy-mm-dd)  | B_Reason

1             2020-04-03           Z_B

2             2020-03-30           Y_B

3             2020-03-29           X_B


只有 Person_Id 列对两个 DF 是通用的。

现在,对于每个人 ID,我想要按照事件发生的顺序(按日期)列出与事件 A 或 B 相对应的原因列表。

也就是说,我想要的输出是:

Person_Id        |     Event_sequence

1                      [X_A, Y_A, Z_B]

2                      [X_A, Y_B, Z_A]

3                      [Z_A, X_B]

我正在努力使用 Python 获得此输出,因为 Person_ID 是两个数据框中唯一的公共列。

有人可以帮我使用 python 获得这个输出吗?

标签: pythonpandasdatetimegroup-bytime-series

解决方案


您可以按照以下步骤进行操作:

(假设df1是 的数据框Event A并且df2是 的数据框Event B

1)统一2个数据框的列名

df1a = df1.copy()
df1a.columns = ['Person_Id', 'Event_Date' ,'Reason']

df2a = df2.copy()
df2a.columns = ['Person_Id', 'Event_Date' ,'Reason']

2)将2个新数据框与.append()

df = df1a.append(df2a)

Person_Id3) 使用和对组合数据框进行排序Event_Date

df = df.sort_values(['Person_Id', 'Event_Date'])

   Person_Id  Event_Date Reason
0          1  2020-04-01    X_A
2          1  2020-04-02    Y_A
0          1  2020-04-03    Z_B
1          2  2020-03-29    X_A
1          2  2020-03-30    Y_B
4          2  2020-04-01    Z_A
3          3  2020-03-28    Z_A
2          3  2020-03-29    X_B

.groupby()4) 通过和创建所需的布局.agg,如下所示:

df_out = df.groupby('Person_Id')['Reason'].agg(list).reset_index(name='Event_sequence')

结果:

print(df_out)


   Person_Id   Event_sequence
0          1  [X_A, Y_A, Z_B]
1          2  [X_A, Y_B, Z_A]
2          3       [Z_A, X_B]

推荐阅读