【问题标题】:Pandas Calculate Median of Group over Columns熊猫计算列组的中位数
【发布时间】:2017-02-26 11:18:34
【问题描述】:

我正在尝试计算列中组的中位数。我在

找到了一个非常清晰的例子

Pandas: Calculate Median of Group over Columns

这个问题和答案正是我需要的答案。我创建了发布的确切示例,以自行处理详细信息

import pandas
import numpy

data_3 = [2,3,4,5,4,2]
data_4 = [0,1,2,3,4,2]

df = pandas.DataFrame({'COL1': ['A','A','A','A','B','B'], 
                       'COL2': ['AA','AA','BB','BB','BB','BB'],
                       'COL3': data_3,
                       'COL4': data_4})

m = df.groupby(['COL1', 'COL2'])[['COL3','COL4']].apply(numpy.median)

当我尝试计算 Group over columns 的中位数时,我遇到了错误

TypeError: Series.name must be a hashable type

如果我执行完全相同的代码,唯一的区别是用不同的统计量(均值、最小值、最大值、标准差)替换中值,并且一切正常。

我不明白这个错误的原因以及为什么它只发生在中位数,这是我真正需要计算的。

提前感谢您的帮助,

鲍勃

这是完整的错误信息。我正在使用 python 3.5.2

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-af0ef7da3347> in <module>()
----> 1 m = df.groupby(['COL1', 'COL2'])[['COL3','COL4']].apply(numpy.median)

/Applications/anaconda3/lib/python3.5/site-packages/pandas/core/groupby.py in apply(self, func, *args, **kwargs)
    649         # ignore SettingWithCopy here in case the user mutates
    650         with option_context('mode.chained_assignment', None):
--> 651             return self._python_apply_general(f)
    652 
    653     def _python_apply_general(self, f):

/Applications/anaconda3/lib/python3.5/site-packages/pandas/core/groupby.py in _python_apply_general(self, f)
    658             keys,
    659             values,
--> 660             not_indexed_same=mutated or self.mutated)
    661 
    662     def _iterate_slices(self):

/Applications/anaconda3/lib/python3.5/site-packages/pandas/core/groupby.py in _wrap_applied_output(self, keys, values, not_indexed_same)
   3373                 coerce = True if any([isinstance(x, Timestamp)
   3374                                       for x in values]) else False
-> 3375                 return (Series(values, index=key_index, name=self.name)
   3376                         ._convert(datetime=True,
   3377                                   coerce=coerce))

    /Applications/anaconda3/lib/python3.5/site-packages/pandas/core/series.py in __init__(self, data, index, dtype, name, copy, fastpath)
        231         generic.NDFrame.__init__(self, data, fastpath=True)
        232 
    --> 233         self.name = name
        234         self._set_axis(0, index, fastpath=True)
        235 

    /Applications/anaconda3/lib/python3.5/site-packages/pandas/core/generic.py in __setattr__(self, name, value)

   2692             object.__setattr__(self, name, value)
   2693         elif name in self._metadata:
-> 2694             object.__setattr__(self, name, value)
   2695         else:
   2696             try:

/Applications/anaconda3/lib/python3.5/site-packages/pandas/core/series.py in name(self, value)
    307     def name(self, value):
    308         if value is not None and not com.is_hashable(value):
--> 309             raise TypeError('Series.name must be a hashable type')
    310         object.__setattr__(self, '_name', value)
    311 

TypeError: Series.name must be a hashable type

【问题讨论】:

  • @CodeCupboard 这怎么可能是一个问题? np.median([1,2])(偶数个值)和np.median([1,2, 3])(奇数个)一样有效。

标签: python pandas


【解决方案1】:

不知何故,这个阶段的系列名称被解释为不可散列,尽管据说是一个元组。我认为这可能与修复和关闭的错误相同:

基本上,组中的单个标量值(如您在示例中所使用的)导致无法传递系列的名称。它在0.19.2 中修复。


无论如何,这不应该是一个实际问题,因为您可以(并且应该)直接在 GroupBy 对象上调用 meanmedian 等。

>>> df.groupby(['COL1', 'COL2'])[['COL3', 'COL4']].median()
           COL3  COL4
COL1 COL2            
A    AA     2.5   0.5
     BB     4.5   2.5
B    BB     3.0   3.0

【讨论】:

  • 谢谢。您的 cmets 非常有帮助并解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多