2013-12-23 1 views
2

У меня есть панель pandas с уникальным major_axis, и я пытаюсь суммировать не уникальные строки с помощью groupby, но я получаю сообщение об ошибке, указывающее, что major_axis не является итерируемым. Я искал переполнение стека и панель сообщений, но похоже, что панель не так широко используется, как dataframe.Groupby на неуникальной оси с панелью Pandas

Вот пример, который производит там ошибку:

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') 

и вот StackTrace:

--------------------------------------------------------------------------- 
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 

Любые идеи о том, как справиться с этой ситуацией?

Большое спасибо,

Brendan

+0

Какая версия панд вы используете? С версией разработки это, похоже, работает. – joris

+0

Я использую 0.12.0 – bfcondon

ответ

2

В 0.12 вы можете попробовать

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

Это похоже на работу. Как получить панель с объекта PanelGroupby? – bfcondon

2

Ответ @alko действительно подходит к вашему вопросу, хотя я думаю, что вы неправильно понимают GroupBy. Вам все равно необходимо применить функцию или агрегацию по вызову groupby(), в вашем случае суммировать все элементы в группе data.groupby(..).sum().

Но я бы рекомендовал рассмотреть вопрос о необходимости использования панели. Конечно, я не знаю вашего дела, но во многих случаях с помощью MultiIndex может решить проблему.

Ваша панель и GroupBy будет выглядеть следующим образом:

>>> 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 
+0

Спасибо, я думаю, это может быть лучшим решением. – bfcondon