Язык программирования Python

Как удалить многоиндексные столбцы или строки в dataframe Pandas?

Фреймы данных Pandas предоставляют возможность использования нескольких индексов для маркировки хранимых данных.

Это может использоваться как для столбцов, так и для строк, позволяя вам организовывать определенные типы данных гораздо более эффективным способом.

Можно выбрать различные значения на основе различных уровней индекса.

Чтобы отбросить столбцы или строки мультииндекса в датафрейме, можно использовать метод drop(), как и в случае со стандартными индексами.

Однако необходимо учитывать некоторые дополнительные моменты.

Создание набора данных

Как обычно, перед изучением работы метода drop() в многоиндексных датафреймах, необходимо создать такой, для чего можно использовать следующий код.

import pandas as pd import numpy as np data = np.reshape(np.arange(1, 37), (6, 6)) cols = pd.MultiIndex.from_tuples([("A", "C1"), ("A", "C2"), ("B", "C1"), ("B", "C2"), ("C", "C1"), ("C", "C2")]) rows = pd.MultiIndex.from_tuples([("X", "R1"), ("X", "R2"), ("Y", "R1"), ("Y", "R2"), ("Z", "R1"), ("Z", "R2")]) df = pd.DataFrame(data, columns=cols, index=rows)
Code language: Python (python)
A B C C1 C2 C1 C2 C1 C2 X R1 1 2 3 4 5 6 R2 7 8 9 10 11 12 Y R1 13 14 15 16 17 18 R2 19 20 21 22 23 24 Z R1 25 26 27 28 29 30 R2 31 32 33 34 35 36
Code language: Python (python)

В этом примере данные были созданы с помощью функции np.arange() в сочетании с np.reshape() для получения матрицы 6 на 6.

После этого необходимо создать мультииндексы для столбцов и строк.

Существуют различные способы сделать это, но в примере он был создан из кортежей с помощью функции pd.MultiIndex.from_tuples().

После получения мультииндексных объектов dataframe создается обычным способом, используя эти элементы вместо векторов для индексов строк и столбцов.

Удаление строк или столбцов верхнего уровня

Исключение строк или столбцов первого уровня выполняется так же, как и в стандартном случае.

Просто используйте метод drop() объекта, указав в свойстве columns имя удаляемых столбцов или колонок и, аналогично, свойство index для строк.

Таким образом, для удаления столбца B и строки Y вы можете использовать следующую строку кода.

df.drop(columns="B", index="Y")
Code language: Python (python)
A C C1 C2 C1 C2 X R1 1 2 5 6 R2 7 8 11 12 Z R1 25 26 29 30 R2 31 32 35 36
Code language: Python (python)

В качестве альтернативы, для удаления строк можно указать только имя строки в методе drop().

В случае со столбцами этого также можно добиться, указав имя и присвоив свойству axis значение 1.

Это требует одного шага для удаления столбцов и другого для строк.

С другой стороны, если вы хотите удалить более одного столбца или строки, вам просто нужно передать вектор с индексами, которые вы хотите удалить.

Поэтому для удаления столбцов A и B одновременно со строками X и Z вы можете ввести следующую команду.

df.drop(columns=["A", "C"], index=["X", "Z"])
Code language: PureBASIC (purebasic)
B C1 C2 Y R1 15 16 R2 21 22
Code language: Python (python)

Удаление столбцов или строк мультииндекса

Теперь, в случае, если мы хотим удалить столбцы C2 второго уровня, использование того, что было объяснено до сих пор, приведет к ошибке.

Чтобы избежать этого, необходимо указать через свойство level функции drop(), что вы хотите удалить столбец второго уровня.

То есть, присвоив свойству значение 1, как показано ниже.

df.drop(columns="C2", level=1)
Code language: Python (python)
A B C C1 C1 C1 X R1 1 3 5 R2 7 9 11 Y R1 13 15 17 R2 19 21 23 Z R1 25 27 29 R2 31 33 35
Code language: Python (python)

На самом деле, в этом есть большой смысл, поскольку в случае, когда один и тот же тег используется в двух разных уровнях, Pandas не может знать, какой из них удалить. Поэтому необходимо указать уровень, на котором вы хотите его применить, если он не первый.

В случае с рядами процесс аналогичен предыдущему.

df.drop(index="R2", level=1)
Code language: Python (python)
A B C C1 C2 C1 C2 C1 C2 X R1 1 2 3 4 5 6 Y R1 13 14 15 16 17 18 Z R1 25 26 27 28 29 30
Code language: Python (python)

Как и для индексов первого уровня, также возможно удаление строк и столбцов с помощью одной инструкции. Однако они должны быть одного уровня.

df.drop(columns="C2", index="R2", level=1)
Code language: Python (python)
A B C C1 C1 C1 X R1 1 3 5 Y R1 13 15 17 Z R1 25 27 29
Code language: Python (python)

Сглаживание индексов

В примере, после удаления строки и столбца второго уровня, наличие нескольких индексов является излишним.

Это можно решить, удалив лишние уровни с помощью метода droplevel() индексов.

Метод, единственным параметром которого является уровень, который вы хотите удалить из индексов, по умолчанию это первый уровень (0).

Использовать его просто, достаточно применить его к индексу и присвоить результат датафрейму, как показано в следующем примере.

df2 = df.drop(columns='C2', index='R2', level=1) df2.columns = df2.columns.droplevel() df2.index = df2.index.droplevel()
Code language: Python (python)
C1 C1 C1 R1 1 3 5 R1 13 15 17 R1 25 27 29
Code language: Python (python)

Однако в данном случае может быть интереснее убрать индексы второго уровня.

df2 = df.drop(columns="C2", index="R2", level=1) df2.columns = df2.columns.droplevel(1) df2.index = df2.index.droplevel(1)
Code language: Python (python)
A B C X 1 3 5 Y 13 15 17 Z 25 27 29
Code language: Python (python)

В случае если вы хотите сохранить оба индекса, но удалить подуровни:

df2 = df.drop(columns="C2", index="R2", level=1) df2.columns = df2.columns.droplevel(1) df2.index = df2.index.droplevel(1)
Code language: Python (python)

Заключение

В этой записи мы рассмотрели использование метода drop() для удаления столбцов или строк мультииндекса в фрейме данных Pandas.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *