python - 基于复合 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 行满足所有用户的条件,依此类推。
解决方案
这是我所做的:
我创建了新列“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)
推荐阅读
- visual-studio - 无法在 Visual Studio 2012 中正确查看属性窗口
- php - 如何通过 PHP 在 localhost 中使用 Page Speed Insight API?
- python - 如何使用 pptx python 在 power point 中的字符之间创建空格?
- vue.js - Vue Vuetify 读取动态生成的 v-select 元素的选定选项
- pandas - 为大型数据集汇总数据框中的列
- java - 输入任意数字并使用while循环按降序打印所有奇数
- python-3.x - UnboundLocalError:分配前引用的局部变量“ckpt_path”
- python - 为什么 NetworkX 中生成的图形从 0 而不是 1 开始?
- cocoapods - API 和 POD 有什么区别?
- python - 具有复杂背景的 OCR 时间戳提取