Pandas:显示来自两个不同时间序列的按日期顺序分组在同一 ID 下的列表中的事件

Pandas: Display events in lists grouped under same ID in date order from two different time series

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

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 得到这个输出吗?

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

(假设 df1Event A 的数据帧,df2Event B 的数据帧)

1)统一2个dataframes的列名

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)

3) 使用 Person_IdEvent_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

4)通过.groupby().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]