第二个参数应该只是数组中每个元素的标量。
我只想从数字代码YYYYMMMDD中提取月份和日期。我会为每个值取numpy.mod(datenum,10000)
,但numpy ufunc mod需要两个类似数组的参数。
在pandas.apply上关注instructions后,我尝试使用以下测试代码失败:
import numpy as np
from pandas import *
s = Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
t = s.apply(np.mod,raw=True,args=(10000,))
print s
print t
Traceback (most recent call last):
File "…", line 7, in <module>
t = s.apply(np.mod,raw=True,args=(10000,))
File "…/miniconda/lib/python2.7/site-packages/pandas/core/series.py", line 2023, in apply
mapped = lib.map_infer(values, f, convert=convert_dtype)
File "inference.pyx", line 920, in pandas.lib.map_infer (pandas/lib.c:44780)
File "…/miniconda/lib/python2.7/site-packages/pandas/core/series.py", line 2012, in <lambda>
f = lambda x: func(x, *args, **kwds)
TypeError: 'raw' is an invalid keyword to ufunc 'remainder'
如果没有raw=True
,则错误消息为:
Traceback (most recent call last):
File "…", line 7, in <module>
t = s.apply(np.mod,args=(10000,))
File "…/miniconda/lib/python2.7/site-packages/pandas/core/series.py", line 2017, in apply
return f(self)
ValueError: invalid number of arguments
这是如何运作的?
答案 0 :(得分:4)
由于广播规则,10000是arraylike,您可以将其传递给mod
或%
,就好像它是一个数组:
In [13]: s
Out[13]:
a 85626286
b 66577463
c 75552690
d 36817240
e 75994944
dtype: int64
In [14]: s % 10000
Out[14]:
a 6286
b 7463
c 2690
d 7240
e 4944
dtype: int64
对于apply
,您正在查看错误的文档。你正在看Dataframe.apply
,但是你有一个系列,所以你应该看Series.apply
。 Series.apply
没有raw
参数。
您可能认为删除raw
参数可以解决您的尝试问题,但Series.apply
有一种奇特的行为,如果f
是一个ufunc且没有f
的关键字参数提供,it completely ignores args
。我认为这实际上是一个错误。解决方法是不使用apply
;广播规则使apply
对您的情况多余。