2016-04-13 2 views
0

У меня возникли проблемы, пропускающие (включая все) один субиндекс в то время как они выбрали первое и третьи субиндексы в моем dataframe:панды dataframe ряд мультииндексный пропустить один

У меня есть dataframe (тест) в виде:

signal      dat1  dat2  dat3 
condition epoch time        
A   0  -1100 1.001322 2.884899 -0.659933 
       -1099 1.081918 3.389470 -0.413069 
       -1098 1.168483 3.585312 -0.277902 
       -1097 1.237908 3.439242 -0.299783 
       -1096 1.263452 2.942262 -0.496889 
A   1  -1100 1.001322 2.884899 -0.659933 
       -1099 1.081918 3.389470 -0.413069 
       -1098 1.168483 3.585312 -0.277902 
       -1097 1.237908 3.439242 -0.299783 
       -1096 1.263452 2.942262 -0.496889 

и я хочу, чтобы извлечь условия и временные точки, так что результирующая таблица выглядит следующим образом:

signal      dat1  dat2  dat3 
condition epoch time        
A   0  -1000 1.001322 2.884899 -0.659933 
       -999 1.081918 3.389470 -0.413069 
       -998 1.168483 3.585312 -0.277902 
       -997 1.237908 3.439242 -0.299783 
       -996 1.263452 2.942262 -0.496889 
A   1  -1000 1.001322 2.884899 -0.659933 
       -999 1.081918 3.389470 -0.413069 
       -998 1.168483 3.585312 -0.277902 
       -997 1.237908 3.439242 -0.299783 
       -996 1.263452 2.942262 -0.496889 

Я новичок в панде, и я пробовал различные вещи.

Я думал, что решение будет:

test.loc['A',:,[-1000:-50]] 

И это на самом деле работает, если выбрать моменты времени меньше, чем приблизительно 50 точек данных друг от друга; для большего, однако, первый индекс игнорируется, и он возвращает все значения из первого индекса (который равен -1100). Это меня отличает. Так это выглядит следующим образом (очень хорошо):

In [284]: test.loc['A',:,-1000:-950].head() 
Out[284]: 
signal      dat1  dat2  dat3 
condition epoch time         
A   0  -1000 0.776851 -0.591070 0.435884 
       -999 0.908675 -1.042335 0.084967 
       -998 0.942239 -1.583269 -0.266314 
       -997 0.901392 -2.146548 -0.602187 
       -996 0.814778 -2.663253 -0.892899 

Но это происходит:

test.loc['A',:,-1000:-900].head() 
Out[285]: 
signal      dat1  dat2  dat3 
condition epoch time         
A   0  -1100 1.001322 2.884899 -0.659933 
       -1099 1.081918 3.389470 -0.413069 
       -1098 1.168483 3.585312 -0.277902 
       -1097 1.237908 3.439242 -0.299783 
       -1096 1.263452 2.942262 -0.496889 

все, что я делаю не так, или есть другой простая/интуитивная индексация (я попробовал некоторый .ix, slice(), но не успешно), чтобы выбрать все эпохи, но ограничить время?

+0

кстати. это происходит на pandas 18.0 с 20 эпохами и значениями времени от -1100 до 6000 – TNT

ответ

0

Вызвано ошибкой; обновление за последние this исправление или pandas 0.18.2

1

Это работает:

import pandas as pd 
import numpy as np 

np.random.seed(0) 
idx = pd.IndexSlice 
midx = pd.MultiIndex.from_product([['A', 'B'], [0, 1], range(-1000, 0)]) 
df = pd.DataFrame(np.random.randn(4000, 3), columns=['dat1', 'dat2', 'dat3'], index=midx) 
df.sort_index(inplace=True) 

>>> df.loc[idx['A', :, -1000:-950], :].head() 
       dat1  dat2  dat3 
A 0 -1000 1.764052 0.400157 0.978738 
    -999 2.240893 1.867558 -0.977278 
    -998 0.950088 -0.151357 -0.103219 
    -997 0.410599 0.144044 1.454274 
    -996 0.761038 0.121675 0.443863 

Чтобы воссоздать этот вопрос (возможно, ошибка). Обратите внимание, во второй головке dataframe как раз начинается -1100, несмотря на срез, начиная с -1000:

np.random.seed(0) 
midx = pd.MultiIndex.from_product([['CS'], range(20), range(-1100, 6000)]) 
df = pd.DataFrame(np.random.randn(7100*20, 3), columns=['dat1', 'dat2', 'dat3'], index=midx) 

>>> df.loc[idx['CS', :, -1000:-950], :].head() 
       dat1  dat2  dat3 
CS 0 -1000 -1.306527 1.658131 -0.118164 
    -999 -0.680178 0.666383 -0.460720 
    -998 -1.334258 -1.346718 0.693773 
    -997 -0.159573 -0.133702 1.077744 
    -996 -1.126826 -0.730678 -0.384880 

>>> df.loc[idx['CS', :, -1000:-50], :].head() 
       dat1  dat2  dat3 
CS 0 -1100 1.764052 0.400157 0.978738 # <<< Index Level 2 should start at -1000 
    -1099 2.240893 1.867558 -0.977278 
    -1098 0.950088 -0.151357 -0.103219 
    -1097 0.410599 0.144044 1.454274 
    -1096 0.761038 0.121675 0.443863 

Это использование Python 3.5.1 | Continuum Analytics, Inc. | (по умолчанию, 7 декабря 2015, 11:24:55) и Пандас 0.18.0.

+0

, что дает мне SyntaxError на '[-1000: -950]' (в двоеточии) – TNT

+0

Исправлена ​​ошибка. Никаких скобок, требуемых около '-1000: -950' – Alexander

+0

, действительно работает на вашем df для всех значений, но с той же проблемой на моем. Возможно ли вмешательство в иерархические субиндексы строки (сигнал - состояние, эпоха, время)? У меня такая таблица такая, хотя я даже не достаточно, чтобы создать ее для примера. – TNT

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