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】:您可以按照以下步骤进行操作:
(假设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)
3) 使用Person_Id
和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
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 在标签中按日期对列进行分组?