【问题标题】:How to find repeated patients and add a new column如何找到重复患者并添加新列
【发布时间】:2020-04-08 20:22:44
【问题描述】:

我正在处理一个大型医疗数据集。现在我想添加一个代表再入院的列,也就是说,如果患者最多在 6 个月前接受过手术,那么“再入院”列将是该患者在过去 6 个月内进行的手术次数。否则,它将为“0”。我将分享部分数据集:

Patient_ID Surgery_Date
1838       2017-01-05
1838       2018-04-26
87        2017-01-11
1838       2017-07-06
87        2017-03-17
1838       2018-08-02
87        2017-11-15
1838       2018-11-22
87        2017-02-01
87        2017-06-21
1838       2018-06-14

所以,通过这种方式,我想要一个新列,在这个例子中,像这样:

Patient_ID Surgery_Date  Readmission
1838       2017-01-05        0
1838       2018-04-26        0
087        2017-01-11        0
1838       2017-07-06        0
087        2017-03-17        2
1838       2018-08-02        2
087        2017-11-15        1
1838       2018-11-22        2
087        2017-02-01        1
087        2017-06-21        3
1838       2018-06-14        1

有人可以帮帮我吗?

【问题讨论】:

  • 有没有可能患者出现超过 2 次?然后会发生什么?
  • 我重复了身份证(实际上是同一个人),因为那个人不止一次接受过手术。然后我想为那个“重新接纳”写一个专栏

标签: python loops date binary


【解决方案1】:

这是对问题的编辑答案

import pandas as pd
import datetime as dt
import numpy as np

# Your data plus a new patient that comes often                                                                                                                                                                    
data = {'Patient_ID':[12,1352,55,1352,12,6,1352,100,100,100,100] ,
        'Surgery_Date': ['25/01/2009', '28/01/2009','29/01/2009','12/12/2008','23/02/2008','2/02/2009','12/01/2009','01/01/2009','01/02/2009','01/01/2010','01/02/2010']}

df = pd.DataFrame(data,columns = ['Patient_ID','Surgery_Date'])
readmissions = pd.Series(np.zeros(len(df),dtype=int),index=df.index))

# Loop through all unique ids                                                                                                                                                                                      
all_id = df['Patient_ID'].unique()
id_admissions = {}
for pid in all_id:
    # These are all the times a patient with a given ID has had surgery                                                                                                                                            
    patient = df.loc[df['Patient_ID']==pid]
    admissions_sorted = pd.to_datetime(patient['Surgery_Date'], format='%d/%m/%Y').sort_values()

    # This checks if the previous surgery was longer than 180 days ago                                                                                                                                              
    frequency = admissions_sorted.diff()<dt.timedelta(days=180)

    # Compute the readmission                                                                                                                                                                                      
    n_admissions = [0]
    for v in frequency.values[1:]:
       n_admissions.append((n_admissions[-1]+1)*v)

    # Add these value to the time series                                                                                                                                                                           
    readmissions.loc[admissions_sorted.index] = n_admissions


df['Readmission'] = readmissions

这会返回

    Patient_ID Surgery_Date  Readmission
0           12   25/01/2009            0
1         1352   28/01/2009            2
2           55   29/01/2009            0
3         1352   12/12/2008            0
4           12   23/02/2008            0
5            6    2/02/2009            0
6         1352   12/01/2009            1
7          100   01/01/2009            0
8          100   01/02/2009            1
9          100   01/01/2010            0
10         100   01/02/2010            1

希望这会有所帮助! 这可能不是非常python-esque或pandas-esque,但它应该像inteded一样工作。我相信这可以提高效率和可读性。

【讨论】:

  • 是的!这就对了!但是,当我适应我的数据集时,它向我显示了这个错误“Int64Index([7441], dtype='int64') not in index”。我知道它在“readmissions.loc[admissions_sorted.index] = n_admissions”这一行。你知道为什么吗?
  • 尝试更改: readmissions = pd.Series(np.zeros(len(df),dtype=int)) 与: readmissions = pd.Series(np.zeros(len(df),dtype= int),index=df.index)
  • 成功了!非常感谢@wohlrajh。你能快速解释一下为什么使用那行代码可以工作吗?
  • 在此之前,“重新接纳”的索引只是一个从 0 到数据帧长度的范围。但是,您的数据框可能有不同的索引,可能存在差距。因此,我需要确保对我的重新接纳变量使用与初始数据帧完全相同的索引。
  • 是的!这发生在我的数据框中!我有一些空白,因为我必须清理一些行,所以这就是原因!非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多