首页 > 解决方案 > 基于复合 groupby 操作,以每年/n 间隔向后查看列值的总数

问题描述

我有一个表格,其中每个用户都有一个唯一的注册日期,如下表所示。用户还具有与包含多个诊断代码的每一行相关联的服务日期(包括但不限于一组有限的字符串值,例如,dx_A、dx_B、dx_C、...dx_N;只有 dx_{A、B、C } 为清楚起见,在与每个服务日期相关的列中显示。

用户身份 注册日期 服务日期 代码_1 代码_2 代码_3
一种 2019-01-30 2018-06-15 dx_A dx_B dx_C
一种 2019-01-30 2017-05-20 dx_B dx_B dx_A
一种 2019-01-30 2017-01-15 dx_B dx_B dx_B
一种 2019-01-30 2018-02-10 dx_A dx_C dx_A
一种 2019-01-30 2017-12-14 dx_C dx_B dx_B
2018-03-07 2017-02-01 dx_A dx_C dx_B
2018-03-07 2016-10-25 dx_C dx_A dx_C
2018-03-07 2016-05-25 dx_B dx_C dx_A
2018-03-07 2018-01-30 dx_A dx_A dx_B

现在,使用 pandas,我想找出每个用户在从注册日期起 1 年、2 年和 3 年的时间间隔内发生的每个代码的总数,因此生成的表格类似于下面给出的表格。

用户身份 dx_A_1_yr dx_A_2_yr dx_A_3_yr dx_B_1 年 dx_B_2 年 dx_B_3 年 dx_C_1yr dx_C_2 年 dx_C_3yr
一种 3 1 0 1 4 3 2 1 0
2 3 0 1 2 0 0 4 0

特别是,我无法获取基于每个用户的服务日期的相关行,enroll_date 组合的年度间隔回顾时间。

上表中的示例,对于用户 A 查看 2018-01-30 到 2019-01-30 之间第一年的时间间隔,第 1 行和第 4 行满足条件,因此从这两行中相应地填充代码计数对于用户 A 的第一年。对于同一用户,对于第 2 年间隔 2018-01-30 到 2017-01-30,第 2 行和第 5 行满足所有用户的条件,依此类推。

标签: pythonpandaspandas-groupby

解决方案


这是我所做的:

  • 我创建了新列“dx_A”、“dx_B”和“dx_C”,其中包含代码在每行中出现的次数。

  • 对于每一年,我都使用 .loc 过滤延迟在询问年份的 service_dates。

  • 然后我使用 groupby 有一行 A 和另一行 B

  • 我根据年份重命名带有后缀的列

  • 最后,我连接所有年度数据帧并在没有的地方写入 0 值。

该表名为“表”

for code in ['dx_A', 'dx_B', 'dx_C']:
    table[code] = (table == code).sum(axis=1)
table = table.drop(['Code_1', 'Code_2', 'Code_3'], axis=1)

result = pd.DataFrame()
for year in [1, 2, 3]:
    df_year = table.loc[(table.enroll_date < table.service_date + pd.DateOffset(years=year)) & 
                       (table.enroll_date >= table.service_date + pd.DateOffset(years=year-1))]
    result_tmp = df_year.groupby('user_id').sum().add_suffix('_' + str(year) + '_yr')
    result = pd.concat([result, result_tmp], axis=1, sort=False)

result = result.fillna(0).astype(int)

这是我得到的结果 结果


推荐阅读