python - 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 获得这个输出吗?
解决方案
您可以按照以下步骤进行操作:
(假设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_Id
3) 使用和对组合数据框进行排序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]
推荐阅读
- snowflake-cloud-data-platform - s3下.csv文件中的雪花外部表
- python - 如何在第二级下删除多索引数据框中的第一列排除某些列
- fortran - .gt.、.lt.、.ne. 等首字母缩略词在 Fortran 95 中是否被认为已过时?
- mysql - PyMySQL 可以用作 MySQL/Connector for Python 的替代品吗?
- android - 未检测到键盘。MediaQuery.of(context).viewInsets.bottom 总是返回 0.0
- javascript - Material-UI 复选框不适用于 Redux 商店
- javascript - 需要重构的 ReactJs 函数(如果可能)
- matrix - 为什么简单的矩阵乘法在 Julia 中会占用如此多的垃圾收集器时间?
- android - 多个 API 同时调用,并在相应请求处理完成后立即更新 UI Android
- rust - 使用带有自定义结构的 Rayon into_par_iter().sum()