我有一个数据集,其中我试图确定每个人的风险因素的数量。所以我有以下数据:
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,但它并没有真正解决如何使用多列中的不同条件将其应用于整个新列。有什么建议吗?
答案 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)
我会这样做。
(请注意,如果您的吸烟者和糖尿病专栏已经是布尔值(真/假)而不是字符串,这会更简单。)
可能看起来像这样:
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)