首页 > 解决方案 > 根据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()来过滤数据,但在这种情况下这不起作用,因为所有患者都在至少一个给定日期接受了这两项测试。

标签: pythonpandasduplicates

解决方案


这可以使用 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

推荐阅读