【问题标题】:How to apply a function (numpy ufunc) with two array arguments to one pandas Series?如何将具有两个数组参数的函数(numpy ufunc)应用于一个熊猫系列?
【发布时间】:2014-08-01 14:38:49
【问题描述】:

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

我只是想从 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

这是如何工作的?

【问题讨论】:

  • s 应该如何表示日期?您正在从标准正态分布中绘制浮点数;结果看起来不会像 8 位日期。
  • 这是我的测试代码,我可以通过快速编辑使其更清晰。但是,那我该如何为mod 指定10000 呢?

标签: python arrays numpy pandas


【解决方案1】:

由于广播规则,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 的关键字参数,it completely ignores args。我认为这实际上是一个错误。解决方法是不要为此使用apply;广播规则使apply 对您的情况来说是多余的。

【讨论】:

  • 美丽。如果我再次需要它,我仍然不知道 apply 应该如何工作,但这解决了手头的问题。谢谢。
  • 实际上,请注意,这并不是上述问题的真正答案。我会给你功劳,但这会误导其他人在apply. 上寻找答案的问题,对不起……
  • @László:嗯,这你如何以你想要的方式应用 NumPy ufunc。我已经扩展了答案,解释了您的尝试失败的原因;这能回答你的问题吗?
  • 谢谢,我接受了答案。如果 ufunc 需要一个数组,也许你可以更清楚地知道不使用 apply 可以广播(如果这是正确的话)第二个参数。
  • @László:嗯,实际上,它可以广播。我对将整个系列作为参数传递是如何工作的有点搞混了。仅删除raw 参数的真正问题似乎是Series.apply 中的一个错误,导致它忽略args。我再次编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
相关资源
最近更新 更多