Я создал 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]"
Я предпочитаю хранить индекс чисел в качестве кортежа вместо двух значений, если это не рекомендуется. Может ли кто-нибудь указать, где я ошибаюсь или что мне делать, чтобы получить доступ к индексам?
Вы можете использовать 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
Я просто пытаюсь исправить ваш код здесь
df[df.index.isin([('a',('one',2))])]
Out[398]:
position
letters numbers
a (one, 2) 1
Вы также можете использовать исключительно xs
:
df.xs(('a',('one',2)), level=[0,1])
Урожайность:
position
letters numbers
a (one, 2) 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
numbers
уровня всегда имеют 2 элемента. Я закончил тем, что разделил это, поскольку другие методы были слишком многословны.