MultiIndex с одним из индексов в виде кортежа

1

Я создал dataframe с мультииндексисом, где одним из индексов является кортеж. Я не могу использовать.loc для индексирования.

Вот кадр данных:

a = [['a','a','a','b','b','b','c','c'],[('one',2),('one',1),('two',1),('two',1),('two',2),('one',2),('two',2),('one',1)]]
t_index=pd.MultiIndex.from_tuples(list(zip(*a)),names=['letters','numbers'])

b=[1,4,3,5,7,2,6,1]

df=pd.DataFrame({'position':b},t_index)
print(df)
                  position
letters numbers           
a       (one, 2)         1
        (one, 1)         4
        (two, 1)         3
b       (two, 1)         5
        (two, 2)         7
        (one, 2)         2
c       (two, 2)         6
        (one, 1)         1

Когда я пытаюсь получить доступ с помощью.loc, я получаю следующую ошибку:

df.loc[('a',('one',2))]
"None of [('one', 2)] are in the [columns]"

Я предпочитаю хранить индекс чисел в качестве кортежа вместо двух значений, если это не рекомендуется. Может ли кто-нибудь указать, где я ошибаюсь или что мне делать, чтобы получить доступ к индексам?

Теги:
pandas

4 ответа

1
Лучший ответ

Вы можете использовать loc + xs

df.loc['a'].xs(('one',2))

Или же:

df.xs(['a', ('one',2)],level=[0,1])

Или (более интуитивно понятный)

df.xs(['a', ('one',2)],level=['letters','numbers'])

Выход:

                  position
letters numbers 
a   (one, 2)         1
1

Я просто пытаюсь исправить ваш код здесь

df[df.index.isin([('a',('one',2))])]
Out[398]: 
                  position
letters numbers           
a       (one, 2)         1
1

Вы также можете использовать исключительно xs:

df.xs(('a',('one',2)), level=[0,1])

Урожайность:

                  position
letters numbers           
a       (one, 2)         1
1

Если ваши numbers уровня индекса всегда будут иметь два элемента, я предлагаю вам разделить уровень на два.

tups = [(letter,) + number for letter, number in df.index]
idx = pd.MultiIndex.from_tuples(tups, names=['letters', 'numbers_0', 'numbers_1'])

df_ = df.set_index(idx)

df_.loc[[('a', 'one', 2)]]

                             position
letters numbers_0 numbers_1          
a       one       2                 1

Кроме того, я предпочитаю использовать xs с level как показано вначале @rahlf23

  • 0
    Действительно, numbers уровня всегда имеют 2 элемента. Я закончил тем, что разделил это, поскольку другие методы были слишком многословны.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню