【问题标题】:compare two date columns - check if they fall in range - take value from 3rd column比较两个日期列 - 检查它们是否在范围内 - 从第三列获取值
【发布时间】:2021-01-10 14:03:56
【问题描述】:

我正在研究一个问题,即是否在入院后的负 1 到 + 3 天内收到患者的测试结果。如果是这样,我想检索他们首先被录取到哪个部门。

复杂性来自入院期间接受多次检测的患者以及在短时间内重新入院的患者。每周测试 3 次并不少见。然而,未经录取的测试也是可能的。我想确保我得到与考试结果及其日期相关的录取部门。

数据来自使用 python 连接的两个不同的表(出于技术原因/由于不同的数据源)。我已经在 pin 上完成了这些 dfs 的左(外)连接,因此最终 df 是长格式。

例如

pin= [1522, 1522, 3830] 

date_rslt = ['2018-04-18', '2018-04-18', '2018-04-09'] 

date_admis = ['2017-12-14', '2018-04-17', '2018-04-08'] 
dept = ['ER', 'INT', 'ER']

df = pd.DataFrame(list(zip(pin, date_rslt, date_admis, dept)), 
               columns =['pin', 'date_rslt', 'date_admis', 'dept']) 

问题:

  • 以下代码向我抛出此错误,但我看不出代码有什么问题。如果解决了,这能正常工作吗?
  • 有任何改进此代码的建议吗?

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

import pandas as pd
from datetime import datetime, timedelta

department = []

if (df_final['resultaatdatum'] < (df_final['date_admission'] +  timedelta(days = + 3))) and (df_final['resultaatdatum'] > (df_final['date_admission'] + timedelta(days = - 1))):
    department.append(df_final['admissiondepartment'])
else:
    department.append(NaN)
    
df_final['department'] = department

我应该得到df_final['department'] = [NaN, 'INT', 'ER']

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用迭代。一个系列不能给出 if 期望的单个布尔值。

    for index,row in df_final.iterrows():
        if (df_final['date_rslt'][index] < (df_final['date_admis'][index] +  timedelta(days = + 3))) and (df_final['date_rslt'][index] > (df_final['date_admis'][index] + timedelta(days = - 1))):
            department.append(df_final['dept'][index])
        else:
            department.append(np.NaN)
    

    输出:

    [nan, 'INT', 'ER']
    

    【讨论】:

      【解决方案2】:

      你可以通过这种方式在没有列表的情况下做到这一点:

      import numpy as np
      
      m =(df['date_rslt'] < (df['date_admis'] +  timedelta(days = + 3))) & (df['date_rslt'] > (df['date_admis'] + timedelta(days = - 1)))
      
      df.loc[~m,"dept"] = np.nan
      

      输出:

          pin    date_rslt    date_admis  dept
      0   1522    2018-04-18  2017-12-14  NaN
      1   1522    2018-04-18  2018-04-17  INT
      2   3830    2018-04-09  2018-04-08  ER
      

      【讨论】:

        【解决方案3】:

        如果您想查看哪些患者在入院后-1到+3天之间收到了测试结果,那么您可以直接查询数据:

        df['date_rslt'] = pd.to_datetime(df['date_rslt']) # will need to be datetime
        df['date_admis'] = pd.to_datetime(df['date_admis']) # will need to be datetime
        
        df['admis_plus_3'] = df['date_admis'] + pd.Timedelta(days=3)
        df['admis_minus_1'] = df['date_admis'] + pd.Timedelta(days=-1)
        
        patients = df.query('(date_rslt < admis_plus_3) & (date_rslt > admis_minus_1)')
        

        如果您需要从中提取部门列表,您可以这样做:patients['dept']

        或者,如果您需要将 NaN 行重新合并到数据中,您可以随时与其他数据集进行合并。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多