pandas计算中的最小值

时间:2017-12-19 13:55:14

标签: python pandas csv min

我想将我之前写的一段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)

提前致谢!

2 个答案:

答案 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。