使用partial with groupby并在Pandas中应用

时间:2014-03-24 09:38:37

标签: python pandas

我在使用groupby with partial并在Pandas中申请时遇到了麻烦。也许我没有使用这个权利?

data = {'a':[1,1,2,2],'b':['Y','Y','N','Y'], 'c':['Y','Y','N','Y']}
df = pandas.DataFrame(data)
def countY(columnName, group): return len(group[group[columnName] == 'Y'])
df.groupby('a').apply(partial(countY, 'b'))

属性错误:' functools.partial'对象没有属性' _ 模块 _'

welcome@welcome-ThinkCentre-Edge72:~$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> from functools import partial
>>> data = {'a':[1,1,2,2],'b':['Y','Y','N','Y'], 'c':['Y','Y','N','Y']}
>>> df = pandas.DataFrame(data)
>>> def countY(columnName, group): return len(group[group[columnName] == 'Y'])
... 
>>> df.groupby('a').apply(partial(countY, 'b'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 420, in apply
    @wraps(func)
  File "/usr/lib/python2.7/functools.py", line 33, in update_wrapper
    setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'functools.partial' object has no attribute '__module__'
>>> pandas.__version__
'0.13.1'
>>> 

1 个答案:

答案 0 :(得分:2)

此处无需使用functools.partial,因为您可以在apply调用中为函数提供参数。

如果你的函数有第一个参数组(所以切换参数的顺序),那么apply中的其他参数将传递给函数,这样你就可以指定columnName在申请中:

In [10]: def countY2(group, columnName):
    ...:    return len(group[group[columnName] == 'Y'])
    ...: 

In [11]: df.groupby('a').apply(countY2, 'b')
Out[11]: 
a
1    2
2    1
dtype: int64

部分不起作用的原因是,functools.wraps似乎与functools.partial无法合作(在申请中使用了wraps)。