对于函数f,df.apply(f)将所有负值转换为零?

时间:2017-04-12 23:29:59

标签: python pandas

假设df是一个完全由浮点数组成的Pandas数据帧。

我知道

df[df < 0] = 0

用{0}替换df中的所有负值,但我会问一些不同的东西。我想知道我必须在表达式

中使用什么函数f
df.apply(f)

...结果数据框在df具有负数的位置处为零。

FWIW,以下因错误而失败:

df.apply(lambda x: max(x, 0))

......以下产生了错误的结果:

df.apply(lambda x: numpy.max(x, 0))

更一般地说,如何将非向量化,标量返回函数应用于数据帧 A 的每个单元格,从而生成一个与 A 形状相同的新数据框?

2 个答案:

答案 0 :(得分:4)

这需要applymap,不适用:

df = pd.DataFrame(np.random.randn(4, 2))

df
Out: 
          0         1
0  1.157994 -0.729533
1 -1.062847  1.119744
2 -0.424534 -0.058468
3  0.465355 -0.838637

df.applymap(lambda x: max(x, 0))

Out: 
          0         1
0  1.157994  0.000000
1  0.000000  1.119744
2  0.000000  0.000000
3  0.465355  0.000000

答案 1 :(得分:0)

NB:我接受了ayhan的答案,因为我发现它最终更有用,但严格来说,下面的答案更接近我实际要求的答案。)

import numpy as np

lambda x: np.maximum(x, 0)

注意: np.maximum不应与np.max混淆!

E.g。

import pandas as pd

df = pd.DataFrame(np.random.randn(4, 2))

df
#           0         1
# 0  0.065962 -0.146952
# 1  0.248722  0.529046
# 2 -1.027380  0.632114
# 3  0.928840 -0.188312

df.apply(lambda x: np.maximum(x, 0))
#           0         1
# 0  0.065962  0.000000
# 1  0.248722  0.529046
# 2  0.000000  0.632114
# 3  0.928840  0.000000