Неожиданное поведение для pd.DataFrame.drop при использовании с фреймом данных многоуровневого индекса - PullRequest
2 голосов
/ 10 марта 2020

Я получаю неожиданное поведение после удаления столбца из мультииндексного фрейма данных в pandas.

Мне нужно получить крайние (уровень = 0) столбцы для мультииндексного фрейма данных после падения столбца. Чтобы получить столбцы уровня = 0, я использовал:

df.columns.levels[0]

Однако, даже после удаления указанного столбца c из исходного кадра данных и присвоения его новому кадру данных, я по-прежнему получаю те же элементы на индексный список вместо обновленного списка столбцов.

Например:

INPUT: df
Box       '1'                  '2'                   '3'
Latency   code latency  loc    code latency  loc    code latency  loc
0         9170.  948.    L.    8170.  328.    R.    9160.  238.    L.
1         7540   1501.   R     9170.  9028.   L.    7170.   94.    L.
INPUT:df.columns.levels[0]
Out: Index(['1', '2', '3'], dtype='object', name='Box Number')



dropped_df = df.drop('2', axis=1, level=0)
INPUT: dropped_df.columns.levels[0]
Out: Index(['1', '2', '3'], dtype='object', name='Box Number')


INPUT: dropped_df
Out: 
Box       '1'                  '3'                  
Latency   code latency  loc    code latency  loc
0         9170.  948.    L.    9160.  238.    L.
1         7540   1501.   R     7170.   94.    L.

Я не уверен, что это ошибка или я что-то не так делаю ... Почему обновленный фрейм данных (dropped_df) возвращать те же столбцы, что и исходный кадр данных, даже если выходные данные обновленного df показывают, что кадр данных был изменен? Кэшируется (копируется) исходный кадр данных?

Любая помощь / указатели будут оценены!

ПРИМЕЧАНИЕ. Я использую python = 3.6.8. / pandas = 0.25.0

РЕДАКТИРОВАТЬ 1: столбцы имеют тип string, поэтому неправильные типы не влияют на поведение.

1 Ответ

2 голосов
/ 10 марта 2020

После некоторого исследования и использования кода, который вы даете в качестве примера, и попытки:

dropped_df.columns.levels[1] = dropped_df.columns.levels[1]

Я получил следующую ошибку:

TypeError: 'FrozenList' does not support mutable operations.

Исследование pandas документации кажется, что действительно, как указано в этом ответе :

Конструкция используется для представления уровней MultiIndex, меток и имен. Суть в том, чтобы предотвратить изменение этих атрибутов и принудительно использовать методы (например, set_levels ()). Поскольку их состояние не может быть изменено независимо (для уровня / меток), но должно быть изменено вместе.

Объясняя, почему, когда мы видим dropped_df.columns.levels[1], мы получаем замороженные (оригинальные) значения, не равные что мы видим при простом отображении dropped_df

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