2013-09-05 41 views
1

我有一個非常大的Dataframe,它是由datetime索引的。我使用GROUPBY來創建新表如下Groupby和Multi索引

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

燦你發佈總結數據幀的幾行? – TomAugspurger

回答

0

你是對的這應該是訪問一行的顯而易見的方式,但MultiIndex的日期時間部分似乎存在問題(我認爲這是一個錯誤,因爲它只與三個級別中的兩個級別一起工作,但與三。而且它也適用於日期時間是唯一的索引)。

作爲一種變通方法,您可以使用,而不是一個字符串明確大熊貓時間戳,這個工程:

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