首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫-如何按日期挑选事件,并创建一个新的有序数据。-外科病人

熊猫-如何按日期挑选事件,并创建一个新的有序数据。-外科病人
EN

Stack Overflow用户
提问于 2020-03-27 10:21:39
回答 1查看 171关注 0票数 0

我是神经外科医生。我有600,000份记录,70栏,约有7个日期列,为在医院系统中的病人在6年期间发生的各种事件。我对颅骨植入修复头骨感兴趣。

此数据文件中有4000条记录显示了一种用于插入或移除植入体的操作代码。大约900名患者进行了一次以上的手术,大约有500次插入和500次左右的植入物切除(用于感染等)。我知道操作的日期是pd.datetime。我把病人的身份加密了。

这60万项记录的期限为6年。我需要分析那900名做过多次手术的人。我需要按日期排序操作,因为这只是一个时间快照。例如,病人可以在快照的数据收集开始之前植入一个植入物,然后在快照期间将其移除,然后在快照中重新插入。相反,在快照期间,可以进行相反的插入和删除。所以我想确定移除-插入和插入-删除的数量,以及之间的时间。

理想情况下,我想要一个病人id表作为索引,插入+删除日期作为字段。然后我就可以计算出。

我是python的新手,-可以做基本的过滤,群比,交叉表等,但还不能循环。非常感谢。

代码语言:javascript
复制
        ID  OP_code  OPDATE_01

1       xxx V259    2014-12-12
2       xxx A082    2014-06-23
3       999 V011    2014-08-07
4       xxx A023    2014-09-12
... ... ... ...
473231  xxx A651    2018-10-03
473233  999 V014    2018-07-06
473235  xxx A263    2018-05-18

以下是一些数据,这些行是单独的护理事件,因此患者ID列并不是唯一的。上面,病人ID 999在2014-08-07年间植入了一个植入物(代码V011),然后在2018-07-06将其取出(代码为V014)。所以我想要的是一张

代码语言:javascript
复制
ID.   OPDATE1.    OP_01_code    OPDATE2.   OP_02_code

999.  2014-08-07.  V011         2018-07-06.  V014

要做到这一点,我需要搜索4000条记录数据中的3000名左右的个人ID患者,以便为每个患者获取个人手术,然后将他们按上表顺序排序。显然,大多数人只会做一次手术。

下面是@Arne建议之后的更新。

代码语言:javascript
复制
display(df_implants)
                                    OPDATE_01                    OPERTN_01
ENCRYPTED_HESID     
1111                                [2019-01-26]                 [V011]
1112                                [2019-01-22]                 [V011]
1113                                [2015-09-24]                 [V011]
1114                                [2016-06-21, 2017-02-27]     [V011, V014]
1115                                [2018-12-27]                 [V011]
... ... ...
3046                                [2017-02-18]                 [V011]
3047                                [2013-06-08]                 [V011]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 13:40:30

编辑:,我已经将下面的筛选条件更改为至少两个不同的操作。

这里有一个方法可以做到这一点。为了测试目的,我对您的数据做了一些更改。

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({'ID': [1, 2, 999, 3, 1, 999, 2],
                   'OP_code': ['V011', 'A082', 'V011', 'V011', 'A651', 'V014', 'A263'], 
                   'OP_date': ['2014-12-12', '2014-06-23', '2014-08-07', '2014-09-12', 
                               '2018-10-03', '2018-07-06', '2018-05-18']})
df.set_index('ID', inplace=True)
display(df)
代码语言:javascript
复制
   OP_code     OP_date
ID      
1    V011   2014-12-12
2    A082   2014-06-23
999  V011   2014-08-07
3    V011   2014-09-12
1    A651   2018-10-03
999  V014   2018-07-06
2    A263   2018-05-18

首先,我们应该转换数据,使每个病人只有一行,从列表中的多个操作中收集数据:

代码语言:javascript
复制
df_patients = pd.pivot_table(df, index=df.index, aggfunc=list)
display(df_patients)
代码语言:javascript
复制
     OP_code        OP_date
ID      
1    [V011, A651]   [2014-12-12, 2018-10-03]
2    [A082, A263]   [2014-06-23, 2018-05-18]
3    [V011]         [2014-09-12]
999  [V011, V014]   [2014-08-07, 2018-07-06]

现在给出与您感兴趣的植入物相对应的OP代码列表,我们可以遍历这个DataFrame的行,创建一个只包含的患者的索引--至少有两种不同的感兴趣的。然后,我们可以根据这个新的索引过滤数据。

代码语言:javascript
复制
implant_codes = {'V011', 'V014'}

implant_index = []
for i in df_patients.index:
    """EDIT: filter criterion tightened to at least two different 
       relevant OPs, i.e. the intersection of the implant_codes 
       list with the patient's OP list has at least two elements."""
    if len(implant_codes.intersection(df_patients.OP_code[i])) >= 2: 
        implant_index.append(i)

df_implants = df_patients.filter(implant_index, axis=0)
display(df_implants)
代码语言:javascript
复制
     OP_code       OP_date
ID      
999  [V011, V014]  [2014-08-07, 2018-07-06]

您可以结合DataFrames和lists的索引语法来访问这里的数据元素,例如,df_implants.loc[999, 'OP_date'][0]生成了patient 999:'2014-08-07'的第一个操作日期。

我不建议为每个OP创建单独的列。你可以试试这样的方法:

代码语言:javascript
复制
df_implants[['OP_date_1', 'OP_date_2']] = pd.DataFrame(df_implants.OP_date.values.tolist(), 
                                                       index=df_implants.index)
display(df_implants)
代码语言:javascript
复制
     OP_code       OP_date                   OP_date_1   OP_date_2
ID              
999  [V011, V014]  [2014-08-07, 2018-07-06]  2014-08-07  2018-07-06

然而,这种方法在实践中会遇到麻烦,因为病人的操作次数不同。这就是为什么我认为上面给出的列表表示更自然,更容易处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60884042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档