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



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

我只想从数字代码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.applySeries.apply不接受raw参数

你可能认为删除raw参数会修复你的尝试,但是Series.apply有一个特殊的行为,如果f是一个ufunc,并且没有提供f的关键字参数,它会完全忽略args。我觉得这其实是个虫子。解决方法是不使用apply;广播规则使apply对你的情况是多余的。

相关内容

最新更新