当前位置: 代码迷 >> python >> 与groupby一起使用partial,并在Pandas中应用
  详细解决方案

与groupby一起使用partial,并在Pandas中应用

热度:105   发布时间:2023-07-16 10:29:19.0

我在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'
>>> 

此处无需使用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 )。

  相关解决方案