我想将我之前写的一段python代码转换为pandas,因此它直接在数据帧中完成而不是乱码csv文件。
我想基于多个值(属性)计算设备的运行状况。 假设我有以下df:
A B C
0 7 NaN 8
1 3 3 5
2 8 1 7
3 NaN 0 3
4 8 2 7
我想按如下方式计算健康状况:
请注意
def attributeHealth
仍处于旧格式而不是 转换为熊猫,因为那是我被卡住的部分 是使用csv库的代码
df['Health'] = attributeHealth(df['A'], 10, 0.4) * attributeHealth(df['B'], 5, 0.5) * attributeHealth(df['C'],2 ,0.8) * 100
def attributeHealth(name, weight, limit):
if row[name] != 'NULL':
attrHealth = 1 - min(int(row[name])*weight/100, limit)
else:
attrHealth = 1
return attrHealth
我尝试先将它减少为单个属性,但似乎我不能以这种方式使用min():
inputDF['health'] = 1 - min(inputDF['A']* 2/100, 0.7)
提前致谢!
答案 0 :(得分:2)
您可以使用numpy.minimum
然后替换缺失值reindex
:
inputDF['health'] = ((1 - np.minimum(inputDF['A'].dropna() * 2/100, 0.7))
.reindex(inputDF.index, fill_value=1))
类似的解决方案:
inputDF['health'] = 1 - np.minimum(inputDF['A'].dropna() * 2/100, 0.7)
inputDF['health'] = inputDF['health'].fillna(1)
print (inputDF)
A B C health
0 7.0 NaN 8 0.86
1 3.0 3.0 5 0.94
2 8.0 1.0 7 0.84
3 NaN 0.0 3 1.00
4 8.0 2.0 7 0.84
所有在一起:
def attributeHealth(col, weight, limit):
#return Series (column)
return ((1 - np.minimum(col.dropna() * weight/100, limit))
.reindex(col.index, fill_value=1))
a = attributeHealth(inputDF['A'], 10, 0.4)
b = attributeHealth(inputDF['B'], 5, 0.5)
c = attributeHealth(inputDF['C'], 2, 0.8)
inputDF['Health'] = (a * b * c) * 100
print (inputDF)
A B C Health
0 7.0 NaN 8 50.40
1 3.0 3.0 5 53.55
2 8.0 1.0 7 49.02
3 NaN 0.0 3 94.00
4 8.0 2.0 7 46.44
答案 1 :(得分:1)
您可以使用DataFrame.apply:
inputDF['health'] = inputDF.apply(lambda row: 1 - min(row['A']* 2/100, 0.7),
axis=1)
apply
为每一行执行给定的callable(在本例中为lambda)并返回结果Series。