Pandas MultiIndexing KeyError в частичном индексе метки - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь воспроизвести часть индексации "Basi c по оси с MultiIndex" руководства пользователя pandas .

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
print(df)
print(df['bar'])

Я не понимаю, почему мой код отличается от того, что показано в руководстве пользователя. У меня есть KeyError: 'бар' в последней строке.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Если вы хотите получить доступ к bar, вам нужно использовать loc или транспонировать его, потому что bar отсутствует в столбцах:

>>> df.loc['bar']
            0         1         2         3
one  0.888182  0.066730  1.397408 -0.550522
two -0.258916 -1.859689 -0.294348 -0.646791

transpose:

>>> df.T['bar']

        one       two
0  0.888182 -0.258916
1  0.066730 -1.859689
2  1.397408 -0.294348
3 -0.550522 -0.646791

РЕДАКТИРОВАТЬ:

Как указано, очень полезно, в комментариях, в случае, если вы хотите сохранить мультииндекс:

>>> df.xs('bar',drop_level=False)
                0         1         2         3
bar one -0.857271  1.271094  0.565691 -0.523375
    two  0.826911  0.244787  0.991158 -0.484815

Даже если это будет зависеть на ваш случай использования, кажется, что вам действительно нужно:

>>> arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
>>> df = pd.DataFrame(np.random.randn(4, 8), columns=arrays)

>>> df

        bar                 baz                 foo                 qux          
        one       two       one       two       one       two       one       two
0  1.600817 -1.420187 -0.798078  1.632550 -0.737740 -1.036077 -1.034157  1.576907
1  0.111148 -1.830283  0.507195 -0.042425  0.260859 -1.600065 -0.449921  0.657582
2 -1.054305 -0.885309  0.325678 -0.253772 -0.444176  0.331933  0.332281  0.127738
3  1.071590  0.947280 -0.973616  0.677141  0.133742  1.352731 -0.210731  2.079073

# Then you can do either df['bar'] directly

Ссылки:

  1. df.xs

  2. df.T

  3. df.loc

  4. Связь в вашем вопросе. Я бы посоветовал вам go тщательно пройти через это, это очень хорошо объяснено.

0 голосов
/ 10 апреля 2020

Часть руководства пользователя, на которую вы ссылаетесь ( this ), относится к тем случаям, когда столбцы данных имеют многоиндексные значения. Вы должны посмотреть на это part , когда индекс является многоиндексным.

Для доступа к bar необходимо выполнить:

print(df.loc["bar"])
...