【问题标题】:Search for multiple encounters across rows in pandas在熊猫中跨行搜索多次相遇
【发布时间】:2023-02-08 00:14:16
【问题描述】:

我正在尝试获取患者数据的数据框并创建一个新的 df,如果他们在同一日期遇到了三个服务,则包含他们的姓名和日期。

首先我有一个数据框

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']})

我尝试使用 agg 函数对名称和日期进行分组以创建列表

df_group = df.groupby(['name', 'date']).agg({'department': pd.Series.unique})

对于鲍勃来说,这个创建的部门包含 [泌尿科、肿瘤科、放射科]。

现在,当我尝试在列表中搜索部门,然后只查找包含相关部门的行时,出现错误。

df_group.loc[df_group['department'].str.contains('primary care')]

例如导致 KeyError: '[nan nan nan nan nan] not in index'

我认为有一种更简单的方法,但最终,我只想获得一个人的数据框,其中包含他们遇到泌尿科、肿瘤科和放射科的日期。在上面的 df 中,它会导致:

名称日期 鲍勃 06-02-2023

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    简单的解决方案

    # define a set of departments to check for
    s = {'urology', 'oncology', 'radiation'}
    
    # groupby and aggregate to identify the combination
    # of name and date that has all the required departments
    out = df.groupby(['name', 'date'], as_index=False)['department'].agg(s.issubset)
    

    结果

    # out
          name        date  department
    0      Bob  06-02-2023        True
    1  Charlie  01-02-2023       False
    2    Chris  26-08-2020       False
    3      Sam  08-06-2015       False
    4      Sam  20-12-2022       False
    
    # out[out['department'] == True]
      name        date  department
    0  Bob  06-02-2023        True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2021-12-03
      • 2016-10-16
      • 2019-01-19
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多