我有一个非常大的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]'
答案 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