Как сохранить порядок столбцов при доступе к многоиндексному фрейму данных с использованием `.loc`? - PullRequest
0 голосов
/ 31 декабря 2018

Давайте дадим следующий фрейм данных с многоиндексными столбцами

import numpy as np
import pandas as pd 

a = ['i', 'ii']
b = list('abc')
mi = pd.MultiIndex.from_product([a,b])
df = pd.DataFrame(np.arange(100,100+len(mi)*3).reshape([-1,len(mi)]), 
                  columns=mi)
print(df)
#     i             ii
#     a    b    c    a    b    c
# 0  100  101  102  103  104  105
# 1  106  107  108  109  110  111
# 2  112  113  114  115  116  117

Используя .loc[] и pd.IndexSlice Я пытаюсь выбрать столбцы 'c' и 'b' в том же порядке.

idx = pd.IndexSlice
df.loc[:, idx[:, ['c','b']]]

Однако, если я посмотрю на вывод, запрошенный порядок не будет соблюден!

#     i        ii
#     b    c    b    c
# 0  101  102  104  105
# 1  107  108  110  111
# 2  113  114  116  117

Вот мои вопросы:

  1. Почемупорядок, не сохраненный пандами?Я считаю это довольно опасным, поскольку список ['c', 'b'] подразумевает упорядочение с точки зрения пользователя.
  2. Как получить доступ к столбцам через loc[], сохраняя при этом упорядочение одновременно?

1 Ответ

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

Цитирование по этой ссылке :

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

Так что вместо этого мы должны использовать reindex:

df.reindex(columns=pd.MultiIndex.from_product([a,['c','b']]))
     i        ii     
     c    b    c    b
0  102  101  105  104
1  108  107  111  110
2  114  113  117  116
...