如何将具有两个数组参数的函数(numpy ufunc)应用于一个pandas系列?

时间:2014-08-01 14:38:49

标签: python arrays numpy pandas

第二个参数应该只是数组中每个元素的标量。

我只想从数字代码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

这是如何运作的?

1 个答案:

答案 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.applySeries.apply没有raw参数。

您可能认为删除raw参数可以解决您的尝试问题,但Series.apply有一种奇特的行为,如果f是一个ufunc且没有f的关键字参数提供,it completely ignores args。我认为这实际上是一个错误。解决方法是不使用apply;广播规则使apply对您的情况多余。