似乎我可以将一些没有问题的函数应用到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),所以我不是在寻找这个特定问题的解决方案。相反,我对上面的申请不起作用感兴趣。
答案 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