问题描述
我在groupby中使用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'))
AttributeError:'functools.partial'对象没有属性'_ module _'
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楼
此处无需使用functools.partial
,因为您可以在apply
调用内为函数提供参数。
如果您的函数具有该组作为第一个参数(因此切换参数的顺序),则apply
中的其他参数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
它不适用于partial的原因是functools.wraps
似乎无法与functools.partial
一起使用(在应用程序内部使用了wraps
)。