Groupby和Multi索引

时间:2013-09-05 18:01:00

标签: python python-2.7 pandas

我有一个非常大的Dataframe,它由datetime索引。我正在使用groupby创建一个新表,如下所示

pivot5min1 = df1.groupby(by=[lambda x: dt.datetime(x.year,x.month,x.day,x.hour,x.minute - (x.minute % 5)),'ACCOUNT','TICKER'], as_index=True, sort=True, group_keys=False).agg(sum)

但是,我似乎无法以最明显的直观方式从这个新数据框中访问数据。首先,以下是pivot5min1.index[:5]

给出的索引样本

MultiIndex [(2013-06-19 09:30:00, u'ACCT1', u'ABC'), (2013-06-19 09:30:00, u'ACCT1', u'MNP'), (2013-06-19 09:30:00, u'ACCT1', u'XYZ')]

我可以按如下方式访问第一行:

pivot5min1.loc[('2013-06-19 09:30:00', 'ACCT1')].loc['ABC']

但是当我尝试使用pivot5min1.loc[('2013-06-19 09:30:00', 'ACCT1', 'ABC')]时,我收到以下错误:

KeyError: 'the label [ACCT1] is not in the [columns]'

1 个答案:

答案 0 :(得分:0)

你是对的,这应该是访问一行的明显方式,但是MultiIndex的日期时间部分似乎存在问题(我认为这是一个错误,因为它只适用于三个级别中的两个级别,但是没有三个。当日期时间是唯一的索引时,它也有效。

作为一种变通方法,您可以使用显式的pandas Timestamp而不是字符串,这可行:

>>> df= pd.DataFrame({'ACCOUNT':["ACCT1", "ACCT1", "ACCT1", "ACCT2"],
...                   'TICKER':["ABC", "MNP", "XYZ", "XYZ"], 
...                   'val':[1,2,3,4]},
...                  index=pd.date_range("2013-06-19 09:30:00", periods=4, freq='5T'))
>>> df = df.set_index(['ACCOUNT', 'TICKER'], append=True)
>>>
>>> df.loc[(pd.Timestamp('2013-06-19 09:30:00'), 'ACCT1', 'ABC')]
val    1
Name: (2013-06-19 09:30:00, ACCT1, ABC), dtype: int64

虽然有一个字符串但没有,正如你所报道的那样:

>>> df.loc[('2013-06-19 09:30:00', 'ACCT1', 'ABC')]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 697, in __getitem__
    return self._getitem_tuple(key)
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 258, in _getitem_tuple
    self._has_valid_tuple(tup)
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 692, in _has_valid_tuple
    if not self._has_valid_type(k,i):
  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 767, in _has_valid_type
    raise KeyError("the label [%s] is not in the [%s]" % (key,self.obj._get_axis_name(axis)))
KeyError: 'the label [ACCT1] is not in the [columns]'
>>> df.loc[(pd.Timestamp('2013-06-19 09:30:00', tz=None), 'ACCT1', 'ABC')]
val    1
Name: (2013-06-19 09:30:00, ACCT1, ABC), dtype: int64