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

时间:2014-07-17 18:04:18

标签: python pandas dataset

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

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

每个属性(年龄,吸烟者,糖尿病)都有自己的条件来确定它是否是一个风险因素。因此,如果Age> = 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

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

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

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

3 个答案:

答案 0 :(得分: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)

工作原理

isY - 是一个存储的lambda函数,它检查单元格的值是否为Y,否则返回0,否则返回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

答案 1 :(得分:5)

我会这样做。

  1. 对于每列,使用列条件
  2. 创建一个新的布尔系列
  3. 按行添加这些系列
  4. (请注意,如果您的吸烟者和糖尿病专栏已经是布尔值(真/假)而不是字符串,这会更简单。)

    可能看起来像这样:

    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
    

答案 2 :(得分:-1)

如果你是从excel开始并想要进入下一个演进版,那么我会建议MS访问。学习Panda for python会容易得多。您应该将CountIf()替换为:

风险因素:IIF(年龄> 45,1,0)+ IIF(吸烟者=" Y",1,0)+ IIF(糖尿病=" Y",1, 0)