pandas计算中的最小值

问题描述 投票:2回答:2

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

提前致谢!

python pandas csv min
2个回答
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
投票

你可以使用DataFrame.apply

inputDF['health'] = inputDF.apply(lambda row: 1 - min(row['A']* 2/100, 0.7),
                                  axis=1)

apply为每一行执行给定的callable(在本例中为lambda)并返回结果Series。

© www.soinside.com 2019 - 2024. All rights reserved.