我在使用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'
>>>
答案 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
)。