Выполнение операций с многоиндексированными данными на основе индексов - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть 2-уровневый многоиндексированный (по X и Y) фрейм данных, который выглядит следующим образом:

df=(
    X1   Y1   Z1
              Z2
         Y2   Z3
              Z3
              Z4
    X2   Y3   Z5)

И я хочу выполнить некоторую операцию с Z на основе значений X и YИтак, я написал:

for x in df.index.levels[0]:
    for y in df.index.levels[1]:
        Do something on Z 

Однако, я получаю результат независимо от значений X и Y.

Любая помощь будет оценена

1 Ответ

0 голосов
/ 21 декабря 2018

Я использовал настройки со страницы многоиндексных панд:

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
s = pd.DataFrame(np.random.randn(8, 4), index=arrays)
print(s)

output s:

                0         1         2         3
bar one -2.252251 -0.655827  1.463011 -0.028378
    two  0.764846  0.245175 -0.580668 -1.054938
baz one  1.052068 -0.024946  0.435709  0.067140
    two  0.397881  0.658192 -1.178750 -0.137875
foo one  0.168246  0.391718  1.001085 -0.353019
    two -0.034458 -1.182889  0.207794  0.275627
qux one -1.236448  0.258419  0.999734 -0.774948
    two -0.518770  1.954563 -1.627627  0.436150

0, 1, 2, 3 будет вашим "Z"

Итак, скажем, я хотел получить доступ к каждой из строк, где второй индекс равен единице, мы можем использовать df.xs ():

s.xs('one', level=1)+1

возвращает (мы добавили 1 в каждый столбец, гдеsecond index = 'one'):

            0         1         2         3
bar -1.252251  0.344173  2.463011  0.971622
baz  2.052068  0.975054  1.435709  1.067140
foo  1.168246  1.391718  2.001085  0.646981
qux -0.236448  1.258419  1.999734  0.225052

Теперь скажите, что я хотел получить доступ к обоим вторым индексам, где первый индекс = 'bar', и возвести в квадрат это значение:

s.xs('bar', level=0)**2

возвращает квадратзначения индекса 'bar' для второго индекса 'one' и 'two':

            0         1         2         3
one  5.072636  0.430109  2.140401  0.000805
two  0.584989  0.060111  0.337175  1.112894

Level = 0 соответствует вашему 'X', level = 1 соответствует вашему 'Y', а значения соответствуютк вашему «Z».Надеюсь, это поможет!

...