groupby 无法在 Pandas.Series 上工作

groupby not working on Pandas.Series

我正在尝试对 pandas 系列进行 Group_by,然后对其进行排名。奇怪的是,这在以前的 pandas 版本中有效,但自从我们将 pandas 版本升级到 0.14.0

后,现在已停止工作

这里有一个例子

系列

    i1 = pd.MultiIndex(levels=[[0, 1, 2, 3], [u'A', u'B'], [u'Spar', u'PnP', 'Checkers', 'Woolworths']],
          labels=[[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
                  [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1], 
                  [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]],
          names=[u'respondent', u'survey', u'brand'])
s1 = pd.Series.from_array([1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 2, 1, 4, 1, 2, 3, 1, 2, 3, 4, 3, 2, 1, 4, 2, 3, 4, 1, 1, 4, 3, 2], index = i1, name='usage')
s1 
respondent  survey  brand     
0           A       Spar          1
                    PnP           2
                    Checkers      3
                    Woolworths    4
            B       Spar          2
                    PnP           3
                    Checkers      4
                    Woolworths    1
1           A       Spar          3
                    PnP           4
                    Checkers      2
                    Woolworths    1
            B       Spar          4
                    PnP           1
                    Checkers      2
                    Woolworths    3
2           A       Spar          1
                    PnP           2
                    Checkers      3
                    Woolworths    4
            B       Spar          3
                    PnP           2
                    Checkers      1
                    Woolworths    4
3           A       Spar          2
                    PnP           3
                    Checkers      4
                    Woolworths    1
            B       Spar          1
                    PnP           4
                    Checkers      3
                    Woolworths    2
Name: usage, dtype: int64

当我尝试按如下方式进行分组时

s1.groupby(['respondent']).rank()

我收到以下错误

    ---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-41-14bf5be195e8> in <module>()
----> 1 s1.groupby(['respondent']).mean()

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in groupby(self, by, axis, level, as_index, sort, group_keys, squeeze)
   2727         axis = self._get_axis_number(axis)
   2728         return groupby(self, by, axis=axis, level=level, as_index=as_index,
-> 2729                        sort=sort, group_keys=group_keys, squeeze=squeeze)
   2730 
   2731     def asfreq(self, freq, method=None, how=None, normalize=False):

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in groupby(obj, by, **kwds)
   1098         raise TypeError('invalid type: %s' % type(obj))
   1099 
-> 1100     return klass(obj, by, **kwds)
   1101 
   1102 

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in __init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze)
    384         if grouper is None:
    385             grouper, exclusions, obj = _get_grouper(obj, keys, axis=axis,
--> 386                                                     level=level, sort=sort)
    387 
    388         self.obj = obj

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _get_grouper(obj, key, axis, level, sort)
   1978             exclusions.append(gpr)
   1979             name = gpr
-> 1980             gpr = obj[gpr]
   1981 
   1982         if isinstance(gpr, Categorical) and len(gpr) != len(obj):

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in __getitem__(self, key)
    477     def __getitem__(self, key):
    478         try:
--> 479             result = self.index.get_value(self, key)
    480 
    481             if not np.isscalar(result):

/Users/donovanthomson/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in get_value(self, series, key)
   2554                     raise InvalidIndexError(key)
   2555                 else:
-> 2556                     raise e1
   2557             except Exception:  # pragma: no cover
   2558                 raise e1

KeyError: 'respondent'

您需要根据您的索引级别而不是不存在的列进行分组:

In [218]:
s1.groupby(level=0).rank()

Out[218]:
respondent  survey  brand     
0           A       Spar          1.5
                    PnP           3.5
                    Checkers      5.5
                    Woolworths    7.5
            B       Spar          3.5
                    PnP           5.5
                    Checkers      7.5
                    Woolworths    1.5
1           A       Spar          5.5
                    PnP           7.5
                    Checkers      3.5
                    Woolworths    1.5
            B       Spar          7.5
                    PnP           1.5
                    Checkers      3.5
                    Woolworths    5.5
2           A       Spar          1.5
                    PnP           3.5
                    Checkers      5.5
                    Woolworths    7.5
            B       Spar          5.5
                    PnP           3.5
                    Checkers      1.5
                    Woolworths    7.5
3           A       Spar          3.5
                    PnP           5.5
                    Checkers      7.5
                    Woolworths    1.5
            B       Spar          1.5
                    PnP           7.5
                    Checkers      5.5
                    Woolworths    3.5
dtype: float64

如果您愿意,也可以使用s1.groupby(level='respondent').rank()

从技术上讲,我认为它在以前的版本中不应该起作用,因为它在索引级别和列上的语义分组不同