python - Python集 - 如何过滤所有组合
问题描述
我是一名外科医生,正在查看接受过不止一次垂体瘤手术的患者的数据。我有 384 名患者进行了 806 次手术。大部分有2道工序,有的有3道或4道工序。两种工序的操作代码分别为B041和B012。我使用下面的方法循环遍历我的 DataFrame 的行,以仅创建一个索引,该索引仅包含那些至少有两个不同的 OP 感兴趣的患者。
pit_codes = {'B041', 'B012'}
pit_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(pit_codes.intersection(df_patients.OPERTN_01[i])) >= 2:
pit_index.append(i)
df_pits = df_patients.filter(pit_index, axis=0)
display(df_pits)
循环通过的数据框是一个列出操作的数据透视表。
df_patients = pd.pivot_table(dups_ind, index=dups_ind.index, aggfunc=list)
display(df_patients)
这在一定程度上奏效了,但生成的 datframe df_pits
只有 61 名患者而不是 384 名。查看操作序列 -
df_pits.OPERTN_01.value_counts()
[B012, B041] 26
[B041, B012] 26
[B041, B012, B041] 4
[B041, B041, B012] 2
[B012, B012, B041, B041] 1
[B012, B041, B041] 1
[B041, B012, B012] 1
Name: OPERTN_01, dtype: int64
似乎将我的设置定义为pit_codes = {'B041', 'B012'}
不允许大多数情况下患者进行两次相同的手术,例如 B041 然后 B041,或 B012 然后 B012。(由于我的技能很少,我还没有来证明这一点)。我如何创建我的集合来拾取这些操作序列,其中相同的操作执行了两次?
解决方案
我只是猜测您的数据框是什么样的,但这里有一些示例。
启动数据框的一些示例
> import pandas as pd
> df = pd.DataFrame([{'Patient': 'patient1', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B012'},
{'Patient': 'patient2', 'Treatement': 'B022'},
{'Patient': 'patient2', 'Treatement': 'B022'},
{'Patient': 'patient2', 'Treatement': 'B023'},
{'Patient': 'patient2', 'Treatement': 'B041'},
{'Patient': 'patient3', 'Treatement': 'B012'},
{'Patient': 'patient4', 'Treatement': 'B041'},
{'Patient': 'patient5', 'Treatement': 'B012'},
{'Patient': 'patient6', 'Treatement': 'B041'},
{'Patient': 'patient7', 'Treatement': 'B012'},
{'Patient': 'patient8', 'Treatement': 'B012'},
{'Patient': 'patient9', 'Treatement': 'B041'},
{'Patient': 'patient2', 'Treatement': 'B041'},
{'Patient': 'patient2', 'Treatement': 'B041'},
{'Patient': 'patient2', 'Treatement': 'B041'},
{'Patient': 'patient3', 'Treatement': 'B041'},
{'Patient': 'patient4', 'Treatement': 'B012'},
{'Patient': 'patient5', 'Treatement': 'B041'},
{'Patient': 'patient6', 'Treatement': 'B041'},
{'Patient': 'patient12', 'Treatement': 'B033'},
{'Patient': 'patient11', 'Treatement': 'B049'}])
对所有患者及其治疗进行分组:
> df.groupby(['Patient','Treatement']).size()
patient1 B012 1
patient11 B049 1
patient12 B033 1
patient2 B012 6
B022 2
B023 1
B041 4
patient3 B012 1
B041 1
patient4 B012 1
B041 1
patient5 B012 1
B041 1
patient6 B041 2
patient7 B012 1
patient8 B012 1
patient9 B041 1
定义我们感兴趣的治疗方法:
> pit_codes = ['B041', 'B012']
为方便起见,将列表应用为过滤器并启动第二个数据框 (df2)。
> df2=df.query('Treatement == @pit_codes')
打印每位患者、每次治疗(和计数)的信息
> df2.groupby(['Patient','Treatement']).size()
Patient Treatement
patient1 B012 1
patient2 B012 6
B041 4
patient3 B012 1
B041 1
patient4 B012 1
B041 1
patient5 B012 1
B041 1
patient6 B041 2
patient7 B012 1
patient8 B012 1
patient9 B041 1
我希望这会有所帮助,但在不知道实际数据帧的情况下有点棘手。
推荐阅读
- java - 如何在文本中的其他一些点显示 MultiAutoCompleteTextView 下拉菜单
- mysql - 如何将 2 个成员 ID 链接到 1 个乐队?
- python-3.x - 如何在熊猫中打开一个大的csv文件
- javascript - 如果用户未登录,如何为主页提要和登录页面设置相同的 URL?
- apache-spark - Spark:任务不可序列化的奇怪错误
- javascript - 未捕获(承诺中)类型错误:无法读取 HTMLButtonElement.getVideoSources 未定义的属性“buildFromTemplate”
- amazon-web-services - 使用 AWS SDK Go 从 Fargate 任务中的角色加载 AWS 凭证的正确方法是什么?
- java - 在 eclipse 提供的默认 maven 目录结构中创建文件夹会导致任何问题吗?
- python - 使用 mysql-connector-python 时出现 Django 错误
- javascript - 嵌套的 jQuery 调用:我如何找出发生了什么?