首页 > 解决方案 > 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。(由于我的技能很少,我还没有来证明这一点)。我如何创建我的集合来拾取这些操作序列,其中相同的操作执行了两次?

标签: pythonpandasdataframeset

解决方案


我只是猜测您的数据框是什么样的,但这里有一些示例。

启动数据框的一些示例

 > 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

我希望这会有所帮助,但在不知道实际数据帧的情况下有点棘手。


推荐阅读