如何在Pandas中筛选同一天有三类科室就诊记录的患者数据
解决方法
错误原因分析
你之前用str.contains报错是因为分组后的department列是列表类型,而str.contains仅适用于字符串类型数据,对列表调用会返回NaN,导致loc索引时找不到对应键值,触发KeyError。
简便实现方案
方案一:分组后检查集合包含关系
先按name和date分组,通过集合判断每组是否覆盖所有目标科室:
import pandas as pd df = pd.DataFrame({'name': ['Bob', 'Charlie', 'Bob', 'Sam', 'Bob', 'Sam', 'Chris'], 'date': ['06-02-2023', '01-02-2023', '06-02-2023', '20-12-2022', '06-02-2023','08-06-2015', '26-08-2020'], 'department': ['urology', 'urology', 'oncology', 'primary care', 'radiation', 'primary care', 'oncology']}) # 定义需要匹配的科室集合 target_depts = {'urology', 'oncology', 'radiation'} # 分组筛选出包含所有目标科室的记录,再去重保留姓名和日期 result = df.groupby(['name', 'date']).filter(lambda x: target_depts.issubset(x['department'])) result = result[['name', 'date']].drop_duplicates().reset_index(drop=True) print(result)
方案二:去重计数筛选
先去重避免同一科室重复统计,再通过计数筛选出刚好包含三个目标科室的记录:
import pandas as pd df = pd.DataFrame({'name': ['Bob', 'Charlie', 'Bob', 'Sam', 'Bob', 'Sam', 'Chris'], 'date': ['06-02-2023', '01-02-2023', '06-02-2023', '20-12-2022', '06-02-2023','08-06-2015', '26-08-2020'], 'department': ['urology', 'urology', 'oncology', 'primary care', 'radiation', 'primary care', 'oncology']}) target_depts = {'urology', 'oncology', 'radiation'} # 去重后筛选目标科室记录 unique_filtered = df.drop_duplicates(subset=['name', 'date', 'department']).query("department in @target_depts") # 分组计数,筛选出计数为3的(即三个目标科室都存在) result = unique_filtered.groupby(['name', 'date']).size().reset_index(name='count') result = result[result['count'] == 3][['name', 'date']] print(result)
运行结果
两种方案最终输出一致:
name date 0 Bob 06-02-2023
内容的提问来源于stack exchange,提问作者natrix
相关产品推荐
相关产品推荐

