在多个条件的多个列的pandas python中的COUNTIF

Vic*_*nry 7 python dataset pandas

我有一个数据集,其中我试图确定每个人的风险因素的数量.所以我有以下数据:

Person_ID  Age  Smoker  Diabetes
      001   30       Y         N
      002   45       N         N
      003   27       N         Y
      004   18       Y         Y
      005   55       Y         Y
Run Code Online (Sandbox Code Playgroud)

每个属性(年龄,吸烟者,糖尿病)都有自己的条件来确定它是否是一个风险因素.因此,如果年龄> = 45,那么这是一个风险因素.吸烟者和糖尿病患者如果是"Y"则是危险因素.我想要的是添加一个列,根据这些条件为每个人增加风险因素的数量.所以数据看起来像这样:

Person_ID  Age  Smoker  Diabetes  Risk_Factors
      001   30       Y         N             1
      002   25       N         N             0
      003   27       N         Y             1
      004   18       Y         Y             2
      005   55       Y         Y             3
Run Code Online (Sandbox Code Playgroud)

我有一个我在Excel中愚弄的样本数据集,我在那里的方式是使用COUNTIF公式,如下所示:

=COUNTIF(B2,">45") + COUNTIF(C2,"=Y") + COUNTIF(D2,"=Y")

但是,我将使用的实际数据集对于Excel来说太大了,所以我正在学习python的pandas.我希望我能提供一些我已经尝试过的例子,但坦率地说,我甚至不知道从哪里开始.我查看了这个问题,但它并没有真正解决如何使用来自多列的不同条件将其应用于整个新列.有什么建议?

ZJS*_*ZJS 7

如果你想坚持使用熊猫.你可以使用以下......

isY = lambda x:int(x=='Y')
countRiskFactors = lambda row: isY(row['Smoker']) + isY(row['Diabetes']) + int(row["Age"]>45)

df['Risk_Factors'] = df.apply(countRiskFactors,axis=1)
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

isY - 是一个存储的lambda函数,它检查单元格的值是否为Y,否则返回1,否则为0 countRiskFactors - 将风险因子相加

最后一行使用apply方法,并将参数键设置为1,它将方法-first参数 - 沿着DataFrame行方向并返回一个附加到DataFrame的系列.

打印输出df

   Person_ID  Age Smoker Diabetes  Risk_Factors
0          1   30      Y        N             1
1          2   45      N        N             0
2          3   27      N        Y             1
3          4   18      Y        Y             2
4          5   55      Y        Y             3
Run Code Online (Sandbox Code Playgroud)


exp*_*rer 5

我会用以下方式做到这一点.

  1. 对于每列,使用列的条件创建一个新的布尔系列
  2. 按行添加这些系列

(请注意,如果您的吸烟者和糖尿病专栏已经是布尔(True/False)而不是字符串,这会更简单.)

它可能看起来像这样:

df = pd.DataFrame({'Age': [30,45,27,18,55],
                   'Smoker':['Y','N','N','Y','Y'],
                   'Diabetes': ['N','N','Y','Y','Y']})

   Age Diabetes Smoker
0   30        N      Y
1   45        N      N
2   27        Y      N
3   18        Y      Y
4   55        Y      Y

#Step 1
risk1 = df.Age > 45
risk2 = df.Smoker == "Y"
risk3 = df.Diabetes == "Y"
risk_df = pd.concat([risk1,risk2,risk3],axis=1)

     Age Smoker Diabetes
0  False   True    False
1  False  False    False
2  False  False     True
3  False   True     True
4   True   True     True

df['Risk_Factors'] = risk_df.sum(axis=1)

   Age Diabetes Smoker  Risk_Factors
0   30        N      Y             1
1   45        N      N             0
2   27        Y      N             1
3   18        Y      Y             2
4   55        Y      Y             3
Run Code Online (Sandbox Code Playgroud)