Почему dataframe.columns не совпадают со столбцами напечатанного dataframe? - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь установить подкадр данных на основе списка имен столбцов.

Вот пример кода:

import pandas as pd
import numpy as np

arrays = [['A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A3',  'A3', 'A3', 'A4', 'A4', 'A4'],
     ['ba', 'be', 'bi', 'ba', 'be', 'bi', 'ba', 'be', 'bi', 'ba', 'be', 'bi']]
tuples = list(zip(*arrays))

mindex = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(4, 12), index=['A', 'B', 'C', 'D'], columns=mindex)
print(df)

first         A1                      ...        A4                    
second        ba        be        bi  ...        ba        be        bi
A       0.825002 -0.569523  0.332106  ...  0.035184 -1.015359  0.889204
B       0.633793 -0.213981  0.761387  ... -1.566489 -0.298129 -1.203579
C      -0.732290  0.774084  0.520561  ...  0.458506 -0.216635  0.968948
D      -0.418444 -1.096581  0.334761  ...  0.962183  1.950046 -0.532924
[4 rows x 12 columns]


idx_select = ['A2', 'A3', 'A4']
df2 = df.loc[:, idx_select].copy()
print(df2)

first         A2                      ...        A4                    
second        ba        be        bi  ...        ba        be        bi
A      -0.109265  1.442299 -0.206023  ...  0.035184 -1.015359  0.889204
B       0.742486 -0.529073 -1.814155  ... -1.566489 -0.298129 -1.203579
C      -0.477671 -0.689706 -0.717814  ...  0.458506 -0.216635  0.968948
D      -2.269811  0.060901 -0.977420  ...  0.962183  1.950046 -0.532924
[4 rows x 9 columns]

print(df2.columns.levels[0])

Index(['A1', 'A2', 'A3', 'A4'], dtype='object', name='first')

Я ожидал, что окончательный результат будет соответствоватьстолбцы отображаются при печати df2. Почему столбцы все еще содержат исходный элемент A1? Добавление или удаление .copy () ничего не меняет. Я планирую выполнить несколько поднаборов следующим образом.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 октября 2019

Если вы посмотрите на документацию панд , это часть поведения индексации с помощью мультииндексов. Как определяет команда разработчиков, это функция, а не ошибка.

Вы можете использовать remove_unused_levels(), если вы действительно хотите очистить свой индекс.

Из документа:

Определенные уровни

MultiIndex сохраняет все определенные уровни индекса, даже если они на самом деле не используются. При разрезании индекса вы можете заметить это. Например:

In [29]: df.columns.levels  # original MultiIndex
Out[29]: FrozenList([['bar', 'baz', 'foo', 'qux'], ['one', 'two']])

In [30]: df[['foo','qux']].columns.levels  # sliced
Out[30]: FrozenList([['bar', 'baz', 'foo', 'qux'], ['one', 'two']])

Это сделано для того, чтобы избежать повторного вычисления уровней для обеспечения высокой производительности среза. Если вы хотите видеть только используемые уровни, вы можете использовать метод get_level_values ​​().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...