python - 根据python pandas中的日期删除不重复的记录
问题描述
我有这样的数据结构: 样本患者数据
基本上,这是一份在某个日期接受过两次验血(A、B)的患者名单,但他们本可以在另一个日期分别进行其中一次验血(其中许多是),而那些记录都混合在一起,所以我拥有的数据如下:
test_date patient# test_type result
20191001 1 A 77
20191001 2 A 34
20191001 2 B 66
... ... ... ...
20191011 15 A 111
20191011 15 B 222
20191011 1 A 32
20191011 1 B 99
到目前为止,我一直在使用 python(pandas,numpy)来清理数据,现在我正在尝试按日期删除不重复的患者#记录(删除在给定条件下仅接受过一次测试的患者行日期),因为我只想比较在同一日期接受两项测试的患者的测试结果(A,B)。
这里需要注意的是,例如,患者 #1 可能在 2019 年 10 月 1 日仅接受了测试 A,但在 2019 年 10 月 2 日和/或其他一些日期确实接受了测试 A 和 B(1 名患者可以'已经在多个日期收到了两个测试)。因此,在该示例中,我想丢弃患者 #1 的 2019-10-01 测试记录,但保留 2019-10-02 的一个(以及任何后续对)。
理想情况下,我的最终数据应该是这样的: cleaned data
我曾尝试在患者编号上使用duplicated()
和drop_duplicates()
来过滤数据,但在这种情况下这不起作用,因为所有患者都在至少一个给定日期接受了这两项测试。
解决方案
这可以使用 2 group by 和合并来完成。代码中的注释应该有助于解释正在做什么。
# get count of # tests for each patient-date combination
grp_df = df.groupby(['PATIENT','DATE'], as_index=False)\
.agg({'TEST':'count'})\
.rename(columns = {'TEST':'TEST_CT'})\
.sort_values(['PATIENT','DATE'])
filt_df = grp_df[grp_df['TEST_CT'] == 2]\ # filter days when patients got both tests only
.groupby(['PATIENT'], as_index=False)\
.agg({'DATE':'max'}) # get latest date for a patent when both tests were done
op_df = pd.merge(df, filt_df, on = ['PATIENT','DATE']) # filter original data to only include selected patient-date combinations
op_df
推荐阅读
- python - 如何找到不在列表中的非空项的索引?
- django - 使用 Model.objects.create() 时未调用 Django 模型 save() 方法
- python - 列表/字典的值是否在循环之外清空(更多详细信息......)?
- ios - UITableview 的单元格可重用性正在产生问题?
- javascript - 可以将承诺错误解决为更高阶的承诺吗
- html - 如何使用 Typescript 从 Json 获取属性计数
- css - 多个背景图像上的 CSS 背景大小
- python - 如何解决节点不在图中的问题
- java - 在生产中调用时,JPA 本机查询不起作用
- acumatica - 将自定义字段添加到销售订单标题