【问题标题】:COUNTIF in pandas python over multiple columns with multiple conditionspandas python中的COUNTIF在具有多个条件的多列上
【发布时间】:2014-09-08 17:41:30
【问题描述】:

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

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

每个属性(年龄、吸烟者、糖尿病)都有自己的条件来确定它是否是风险因素。因此,如果年龄 >= 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,但它并没有真正解决如何使用来自多个列的不同条件将其应用于整个新列。有什么建议吗?

【问题讨论】:

    标签: python pandas dataset


    【解决方案1】:

    我会这样做。

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

    (请注意,如果您的 Smoker 和 Diabetes 列已经是布尔值(真/假)而不是字符串,这会更简单。)

    它可能看起来像这样:

    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】:

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

    解决方案

    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,否则返回 1,否则为 0 countRiskFactors - 将风险因素相加

    最后一行使用 apply 方法,参数键设置为 1,它将方法 -first 参数 - 沿 DataFrame 逐行应用,并返回一个附加到 DataFrame 的 Series。

    打印 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
    

    【讨论】:

    • 第 5 个人的 risk_factors 不应该是 3 吗?
    • 一般来说,你错过了条件1,也就是那个年龄>45
    • 编辑包括风险因素年龄>45
    【解决方案3】:

    如果您是从 excel 开始并想进入下一个发展阶段,那么我建议您使用 MS Access。学习 Panda for python 会容易得多。您应该将 CountIf() 替换为:

    风险因素:IIF(Age>45, 1, 0) + IIF(Smoker="Y", 1, 0) + IIF(Diabetes="Y", 1, 0)

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2017-11-18
      相关资源
      最近更新 更多