【问题标题】:minimum of values in pandas calculation熊猫计算中的最小值
【发布时间】:2018-06-01 23:33:12
【问题描述】:

我想把我之前写的一段python代码转换成pandas,这样就可以直接在dataframe中完成,而不是乱用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)

提前致谢!

【问题讨论】:

  • 在这个示例 DataFrame 中你想要的输出是什么?
  • 我会是原来的 DF,有一个额外的列“健康”。

标签: python pandas csv min


【解决方案1】:

您可以使用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

【讨论】:

  • 感谢您提供非常完整的答案,看到它的发展很有趣!
【解决方案2】:

您可以为此使用DataFrame.apply

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

apply 为每一行执行给定的可调用对象(在本例中为 lambda)并返回结果系列。

【讨论】:

  • 感谢您的回答。 apply函数我不熟悉,但是看起来很强大,我一定会研究它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2020-04-28
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多