1

我有一个非常大的数据框,它按日期时间索引。我正在使用 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]'

4

1 回答 1

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
于 2013-09-05T20:01:37.553 回答