将函数应用于pandas DataFrame会给出Value Error(只有一个参数)

时间:2014-12-16 13:02:08

标签: python pandas

似乎我可以将一些没有问题的函数应用到DataFrame,但是其他函数会给出一个Value Error。

dates = pd.date_range('20130101',periods=6)
data = np.random.randn(6,4)

df = pd.DataFrame(data,index=dates,columns=list('ABCD'))

def my_max(y):
    return max(y,0)

def times_ten(y):
    return 10*y

df.apply(lambda x:times_ten(x)) # Works fine
df.apply(lambda x:my_max(x)) # Doesn't work

第一个应用正常,第二个生成:

ValueError:('系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。',u'occurred在索引A')

我知道我可以用其他方式生成“max(df,0)”(例如通过df [df <0] = 0),所以我不是在寻找这个特定问题的解决方案。相反,我对上面的申请不起作用感兴趣。

1 个答案:

答案 0 :(得分:4)

max无法处理标量和数组:

>>> max(df['A'], 0)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

使用np.maximum,它确实是元素最大值:

>>> def my_max(y):
...     return np.maximum(y, 0)
... 
>>> df.apply(lambda x:my_max(x))
                A      B      C      D
2013-01-01  0.000  0.000  0.178  0.992
2013-01-02  0.000  1.060  0.000  0.000
2013-01-03  0.528  2.408  2.679  0.000
2013-01-04  0.564  0.573  0.320  1.220
2013-01-05  0.903  0.497  0.000  0.032
2013-01-06  0.505  0.000  0.000  0.000

或使用以元素方式运作的.applymap

>>> def my_max(y):
...     return max(y,0)
... 
>>> df.applymap(lambda x:my_max(x))
                A      B      C      D
2013-01-01  0.000  0.000  0.178  0.992
2013-01-02  0.000  1.060  0.000  0.000
2013-01-03  0.528  2.408  2.679  0.000
2013-01-04  0.564  0.573  0.320  1.220
2013-01-05  0.903  0.497  0.000  0.032
2013-01-06  0.505  0.000  0.000  0.000