Фреймы данных 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.