在pandas中使用COUNTIF对多个列和多个条件进行计数

10 投票
3 回答
37943 浏览
提问于 2025-04-18 13:44

我有一个数据集,想要计算每个人的风险因素数量。我的数据大概是这样的:

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库。我希望能提供一些我已经尝试过的例子,但老实说,我甚至不知道从哪里开始。我看过这个问题,但它并没有真正解决如何用不同条件从多个列来应用到一个新列的问题。有什么建议吗?

3 个回答

-2

如果你是从Excel开始,想要进一步提升的话,我推荐你使用MS Access。这样会比学习Python中的Pandas简单很多。你只需要把CountIf()替换成:

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

14

我会这样做。

  1. 对每一列,使用该列的条件创建一个新的布尔系列(就是一系列真或假的值)
  2. 把这些系列按行相加

(注意,如果你的吸烟者和糖尿病列已经是布尔值(真/假),而不是字符串,这样会更简单。)

它可能看起来像这样:

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
12

如果你想继续使用pandas库,可以使用以下方法...

解决方案

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 - 这是一个存储的函数,它会检查单元格的值是否为Y,如果是,就返回1;如果不是,就返回0。

countRiskFactors - 这个函数会把所有的风险因素加起来。

最后一行使用了apply方法,参数key设置为1,这样就可以按行处理DataFrame中的数据,并返回一个Series,这个Series会被添加到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

撰写回答