繁体   English   中英

使用熊猫面板在非唯一轴上分组

[英]Groupby on non-unique axis with Pandas Panel

我有一个带有非唯一major_axis的熊猫面板,并且我试图使用groupby对非唯一行进行求和,但是我收到一条错误消息,指出major_axis是不可迭代的。 我已经搜索了堆栈溢出和留言板,但是似乎Panel没有像dataframe那样被广泛使用。

这是产生错误的示例:

import pandas as pd
import datetime as dt
import dateutil.relativedelta as rd
import numpy as np

items = ['A','B']
minor_axis = ['x','y']

diff = rd.relativedelta(years=1)

major_axis = [dt.date(2013,1,1) + (diff * shift) for shift in xrange(4)] * 2

values = np.random.randn(2,8,2)

data = pd.Panel(data=values, major_axis=major_axis, minor_axis=minor_axis, items=items)

data.groupby(sum, axis='major')

这是堆栈跟踪:

    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-29-e30fb9b32fce> in <module>()
----> 1 data.groupby(sum, axis='major')

/home/brendan/python_dev/venv/local/lib/python2.7/site-packages/pandas/core/panel.pyc in groupby(self, function, axis)
   1084         from pandas.core.groupby import PanelGroupBy
   1085         axis = self._get_axis_number(axis)
-> 1086         return PanelGroupBy(self, function, axis=axis)
   1087 
   1088     def swapaxes(self, axis1='major', axis2='minor', copy=True):

/home/brendan/python_dev/venv/local/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)
    195         if grouper is None:
    196             grouper, exclusions = _get_grouper(obj, keys, axis=axis,
--> 197                                                level=level, sort=sort)
    198 
    199         self.grouper = grouper

/home/brendan/python_dev/venv/local/lib/python2.7/site-packages/pandas/core/groupby.pyc in _get_grouper(obj, key, axis, level, sort)
   1323             raise AssertionError(errmsg)
   1324 
-> 1325         ping = Grouping(group_axis, gpr, name=name, level=level, sort=sort)
   1326         groupings.append(ping)
   1327 

/home/brendan/python_dev/venv/local/lib/python2.7/site-packages/pandas/core/groupby.pyc in __init__(self, index, grouper, name, level, sort)
   1197             # no level passed
   1198             if not isinstance(self.grouper, np.ndarray):
-> 1199                 self.grouper = self.index.map(self.grouper)
   1200                 if not (hasattr(self.grouper,"__len__") and \
   1201                    len(self.grouper) == len(self.index)):

/home/brendan/python_dev/venv/local/lib/python2.7/site-packages/pandas/core/index.pyc in map(self, mapper)
    856 
    857     def map(self, mapper):
--> 858         return self._arrmap(self.values, mapper)
    859 
    860     def isin(self, values):

/home/brendan/python_dev/venv/local/lib/python2.7/site-packages/pandas/algos.so in pandas.algos.arrmap_object (pandas/algos.c:62269)()

TypeError: 'datetime.date' object is not iterable

关于如何处理这种情况的任何想法?

非常感谢,

布伦丹

在0.12中,您可以尝试

>>> data.groupby(np.sum, axis='major')
<pandas.core.groupby.PanelGroupBy object at 0x1a2ba50>

@alko的答案确实是您问题的解决方案,尽管我认为您误会了groupby。 您仍然需要对groupby()调用应用函数或聚合,以对组data.groupby(..).sum()所有项data.groupby(..).sum()

但是我建议考虑是否需要使用面板。 当然我不知道您的情况,但是在许多情况下, 使用MultiIndex可以解决问题。

您的小组和分组依据如下所示:

>>> items = ['A', 'A', 'B', 'B']
>>> minor_axis = ['x','y', 'x', 'y']
>>> diff = rd.relativedelta(years=1)
>>> major_axis = [dt.date(2013,1,1) + (diff * shift) for shift in xrange(4)] * 2
>>> values = np.random.randn(8,4)
>>> 
>>> data = pd.DataFrame(values, index=major_axis, columns=pd.MultiIndex.from_arrays([items, minor_axis]))
>>> data
                   A                   B          
                   x         y         x         y
2013-01-01 -1.063086  0.564123  0.128006 -0.658767
2014-01-01  2.182473 -0.851618  1.180264  0.165581
2015-01-01 -0.003941  0.590801 -1.616197 -2.270557
2016-01-01 -0.736524  0.172791  1.220589 -1.303294
2013-01-01 -1.052184 -1.171545 -0.473488 -0.140327
2014-01-01  0.021189  0.827241  0.775863 -0.882874
2015-01-01 -1.762289  0.705692  0.593365 -0.984109
2016-01-01 -1.946106 -1.108336 -1.691758 -0.088932

>>> data.groupby(data.index).sum()
                   A                   B          
                   x         y         x         y
2013-01-01 -2.115270 -0.607422 -0.345482 -0.799094
2014-01-01  2.203662 -0.024377  1.956127 -0.717293
2015-01-01 -1.766230  1.296492 -1.022832 -3.254667
2016-01-01 -2.682630 -0.935544 -0.471170 -1.392226

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM