2015-10-14 10 views
0

Я использовал answer to this question, чтобы попытаться сделать подобный фрагмент на моей информационной кадре. Но это не работает, потому что индекс строки - это TimeSeries. Я не уверен, как перефразировать срез для работы.Нарезка MultiIndex с индексом строки Timeseries

df Я использую один индекс TimeSeries, а столбцы - двухуровневый MultiIndex. Я пытаюсь, для произвольной строки, возвращать серию, состоящую из подколонки «px» каждого основного столбца. enter image description here

Первая попытка: df.loc[0,(slice(None), 'px')] бросает TypeError,

TypeError: cannot do index indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [0] of <type 'int'> 

Так я и пытался кормить его DateTime для индекса, вместо междунар:

useIndex = sdf.index[0] 
return df.loc[useIndex,(slice(None), 'px')] 

Что дает a:

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)' 

Постскриптум ...

Если я просто делаю простой,

useIndex = sdf.index [0] useIndex sdf.iloc [useIndex]

Я получаю отказ:

TypeError: cannot do label indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [2015-10-08 00:00:00] of <class 'pandas.tslib.Timestamp'> 

Итак, может быть, проблема в том, что я не передаю действительный указатель на фрагмент MultiIndex?

================

Вот два примера: первый ДФ («ДФ») Я в состоянии вытащить данные, которые я хочу. Второй df ('df2') выдает ошибку типа.

import pandas as pd 
import numpy as np 

cols = [['col_1', 'col_2'], ['delta', 'px']] 
multi_idx = pd.MultiIndex.from_product(cols, names= ["level_0", "level_1"]) 
df = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=range(5), columns=multi_idx) 

row_number =1 

print df.loc[df.index[row_number], pd.IndexSlice[:, 'px']] 

rng = pd.date_range('1/1/2011', periods=5, freq='H') 
df2 = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=rng, columns=multi_idx) 

#print df2.loc[df.index[row_number], pd.IndexSlice[:, 'px']] 
useIndex = df2.index[0] 

print df2.loc[useIndex, pd.IndexSlice[:, 'px']] 
+1

Вместо того чтобы помещать изображение в вашу фреймворк данных, вы должны непосредственно скопировать/вставить данные в рамку. Это упростит другим пользователям копирование данных и использование 'pd.read_clipboard()', чтобы воспроизвести вашу проблему и протестировать ее. –

+0

Ананд S Кумар. Я «скопировал и вставил» фрагмент блока данных, но он просто заканчивается как тарабарщина в окне stackoverflow. – user3556757

+0

После копирования вы должны использовать значок '{}', чтобы превратить его в блок кода, так что он не станет тарабарщиной. –

ответ

1

Использование IndexSlice должно помочь вам получить желаемые результаты. Обратите внимание, что сначала необходимо сортировать столбцы:

cols = [['col_1', 'col_2'], ['delta', 'px']] 
multi_idx = pd.MultiIndex.from_product(cols, names= ["level_0", "level_1"]) 
df = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=range(5), columns=multi_idx) 

>>> df 
level_0  col_1    col_2   
level_1  delta  px  delta  px 
0  0.891758 0.071693 0.629897 0.693161 
1  0.772542 0.022781 0.684584 0.892641 
2  0.925957 0.794940 0.146950 0.134798 
3  0.159558 0.842898 0.677927 0.028675 
4  0.436268 0.989759 0.471879 0.101878 

row_number = 3 
>>> df.loc[df.index[row_number], pd.IndexSlice[:, 'px']] 
level_0 level_1 
col_1 px   0.842898 
col_2 px   0.028675 
Name: 3, dtype: float64 
+0

Привет.Пример здесь работает, но проблема в том, что если индекс является индексом DateTime, df.loc возвращает Type Error rng = pd.date_range ('1/1/2011', period = 5, freq = 'H') df2 = pd.DataFrame (np.random.rand (20) .resape (5, 4), index = rng, columns = multi_idx) print df2.loc [df.index [row_number], pd.IndexSlice [:, 'px']] – user3556757

+0

Работает для меня на Pandas 0.16.2. Обратите внимание на ваше несогласованное использование 'df' в вашем комментарии. Должен быть 'df2.loc [df2.index ...' – Alexander

+0

Александр, да, вы правы. – user3556757

Смежные вопросы