计算熊猫数据框中包含n个值的行数

时间:2019-04-17 16:17:23

标签: python pandas

我正在使用一个表,该表的列中包含对患者执行的操作,每一行代表一个患者。 我需要做的是计算有多少患者接受了相同的程序组合。即,在每一行中都显示过程[A,B]或[A,B,Z]。顺序无关紧要。

因此,假设使用此示例表,我尝试通过以下方式使用.isin()方法:

d = {'col1': ['A', 'A', 'B',], 'col2': ['B', 'D', 'C'], 'col3': ['C', '','X',]}
df = pd.DataFrame(data=d)
print(df)
  col1 col2 col3
0    A    B    C
1    A    D     
2    B    C    X

我想获取给定两个过程,每个过程执行了多少次的列表:

dx1 = ['A', 'B']
df[df.isin(dx1).any(1)].apply(pd.value_counts).sum(axis=1).sort_values(ascending=False)

但是我得到了给定每个过程分别执行并加在一起的次数的列表(而不是“ and”将“ or”作为条件)

C    2.0
H    1.0
D    1.0
A    1.0
     1.0
dtype: float64

我需要为您提供执行A和B以外的过程多少次的列表,在这种情况下,应该为:

C    1.0
dtype: float64

非常感谢您的提前估算。

2 个答案:

答案 0 :(得分:0)

由于您不关心订单,因此集合可以解决您的问题:

d = {'col1': ['A', 'A', 'B',], 'col2': ['B', 'D', 'C'], 'col3': ['C', '','X',]}
df = pd.DataFrame(data=d)
dx1 = ['A', 'B']
df["procedures"] = df.apply(lambda x: [x.col1, x.col2, x.col3], axis=1)
df["contains_dx1"] = df.procedures.apply(lambda x: set(dx1).issubset(set(x)))

答案 1 :(得分:0)

使用

functools.reducemeltisinvalue_counts尝试以下代码:
from functools import reduce
import pandas as pd
d = {'col1': ['A', 'A', 'B',], 'col2': ['B', 'D', 'C'], 'col3': ['C', '','X',]}
df = pd.DataFrame(data=d)
dx1 = ['A', 'B']
df_bool = reduce(lambda a,b: a | b, [df == i for i in dx1])
s = df[df_bool.sum(1).gt(1)].melt()['value'].value_counts()

s[~s.index.isin(dx1)]

输出:

C    1
Name: value, dtype: int64