第二个参数应该是数组中每个元素的同一个标量。
我只想从数字代码YYYYMMMDD中提取月份和日期。我将为每个值取numpy.mod(datenum,10000)
,但是numpy ufunc mod接受两个类似数组的参数。
按照熊猫的说明。我尝试了以下测试代码,但失败了:
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
这是如何工作的?
由于广播规则,10000是数组类型的,您可以将其传递给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
的关键字参数,它会完全忽略args
。我觉得这其实是个虫子。解决方法是不使用apply
;广播规则使apply
对你的情况是多余的。