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

Posted

技术标签:

【中文标题】Pandas:在两个不同时间序列中按日期顺序分组在同一 ID 下的列表中显示事件【英文标题】:Pandas: Display events in lists grouped under same ID in date order from two different time series 【发布时间】:2021-09-16 06:32:00 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

(假设df1Event A 的数据框,df2Event 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)

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]

【讨论】:

非常感谢您的帮助。只是一个小问题,如果 person_id 不是 'int' 并且包含一些字母数字字符,我仍然可以通过将其视为 'object' 类型来按 'person_id' 排序,对吗?这应该没什么区别吧? @AnonymousMe 是的,字符串(对象)类型也可以排序。它将按字母顺序排列。实际上,您也可以仅在排序步骤上对Event_date 进行排序。 .groupby() 命令将在最后一步按组键(即Person_Id)排序。数字字段和字符串都可以。 @AnonymousMe 如果你不想按照Person_Id的顺序排序,你也可以在最后一个语句中使用groupby('Person_Id', sort=False),而你在前面的排序步骤中也没有排序。跨度>

以上是关于Pandas:在两个不同时间序列中按日期顺序分组在同一 ID 下的列表中显示事件的主要内容,如果未能解决你的问题,请参考以下文章

pandas 如何使用 groupby 在标签中按日期对列进行分组?

在熊猫数据框中按日期和计数值分组

如何在 Pandas 中按子类别分组? [复制]

在 Pandas GroupBy 数据框中按 ID 计算两个日期之间的行数

使用 pandas 数据框按时间顺序转换日期

如何在 MongoDB 中按日期分组