我是神经外科医生。我有600,000份记录,70栏,约有7个日期列,为在医院系统中的病人在6年期间发生的各种事件。我对颅骨植入修复头骨感兴趣。
此数据文件中有4000条记录显示了一种用于插入或移除植入体的操作代码。大约900名患者进行了一次以上的手术,大约有500次插入和500次左右的植入物切除(用于感染等)。我知道操作的日期是pd.datetime。我把病人的身份加密了。
这60万项记录的期限为6年。我需要分析那900名做过多次手术的人。我需要按日期排序操作,因为这只是一个时间快照。例如,病人可以在快照的数据收集开始之前植入一个植入物,然后在快照期间将其移除,然后在快照中重新插入。相反,在快照期间,可以进行相反的插入和删除。所以我想确定移除-插入和插入-删除的数量,以及之间的时间。
理想情况下,我想要一个病人id表作为索引,插入+删除日期作为字段。然后我就可以计算出。
我是python的新手,-可以做基本的过滤,群比,交叉表等,但还不能循环。非常感谢。
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)。所以我想要的是一张
ID. OPDATE1. OP_01_code OPDATE2. OP_02_code
999. 2014-08-07. V011 2018-07-06. V014要做到这一点,我需要搜索4000条记录数据中的3000名左右的个人ID患者,以便为每个患者获取个人手术,然后将他们按上表顺序排序。显然,大多数人只会做一次手术。
下面是@Arne建议之后的更新。
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]发布于 2020-03-27 13:40:30
编辑:,我已经将下面的筛选条件更改为至少两个不同的操作。
这里有一个方法可以做到这一点。为了测试目的,我对您的数据做了一些更改。
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) 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首先,我们应该转换数据,使每个病人只有一行,从列表中的多个操作中收集数据:
df_patients = pd.pivot_table(df, index=df.index, aggfunc=list)
display(df_patients) 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的行,创建一个只包含的患者的索引--至少有两种不同的感兴趣的。然后,我们可以根据这个新的索引过滤数据。
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) 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创建单独的列。你可以试试这样的方法:
df_implants[['OP_date_1', 'OP_date_2']] = pd.DataFrame(df_implants.OP_date.values.tolist(),
index=df_implants.index)
display(df_implants) 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然而,这种方法在实践中会遇到麻烦,因为病人的操作次数不同。这就是为什么我认为上面给出的列表表示更自然,更容易处理。
https://stackoverflow.com/questions/60884042
复制相似问题