pandas: нарезать MultiIndex DataFrame по диапазону вторичного индекса

Было опубликовано, что нарезка по второму индексу может быть выполнена в серии панд с несколькими индексами:

import numpy as np
import pandas as pd

buckets = np.repeat(range(3), [3,5,7])
sequence = np.hstack(map(range,[3,5,7]))

s = pd.Series(np.random.randn(len(sequence)), 
              index=pd.MultiIndex.from_tuples(zip(buckets, sequence)))

print s

0  0    0.021362
   1    0.917947
   2   -0.956313
1  0   -0.242659
   1    0.398657
   2    0.455909
   3    0.200061
   4   -1.273537
2  0    0.747849
   1   -0.012899
   2    1.026659
   3   -0.256648
   4    0.799381
   5    0.064147
   6    0.491336

Затем, чтобы получить первые три строки для первого индекса = 1, вы просто говорите:

s[1].ix[range(3)]

0   -0.242659
1    0.398657
2    0.455909

Это отлично работает для одномерных серий, но не для DataFrames:

buckets = np.repeat(range(3), [3,5,7])
sequence = np.hstack(map(range,[3,5,7]))

d = pd.DataFrame(np.random.randn(len(sequence),2), 
                 index=pd.MultiIndex.from_tuples(zip(buckets, sequence)))

print d

            0         1
0 0  1.217659  0.312286
  1  0.559782  0.686448
  2 -0.143116  1.146196
1 0 -0.195582  0.298426
  1  1.504944 -0.205834
  2  0.018644 -0.979848
  3 -0.387756  0.739513
  4  0.719952 -0.996502
2 0  0.065863  0.481190
  1 -1.309163  0.881319
  2  0.545382  2.048734
  3  0.506498  0.451335
  4  0.872743 -0.070985
  5 -1.160473  1.082550
  6  0.331796 -0.366597

d[1].ix[range(3)]

0  0    0.312286
   1    0.686448
   2    1.146196
Name: 1

Он дает вам «1-й» столбец данных и первые три строки, независимо от первого уровня индекса. Как вы можете получить первые три строки для первого индекса = 1 для мультииндексированного DataFrame?


person worldcitizen    schedule 16.11.2012    source источник


Ответы (2)


.loc более эффективен и оценивается одновременно

s.loc[pd.IndexSlice[1],:3] вернет 0-й уровень = 1 и запись [0:3].

person um8ra    schedule 17.04.2015

person    schedule
comment
На самом деле, похоже, что если вы используете метод .ix, вы не обязаны явно использовать слайсы. например d.xs(1).ix[arange(3)] работает. - person worldcitizen; 18.11.2012