Сообщить об ошибке.

Метод .drop() объектов Series/DataFrame в pandas

Удаляет указанные метки из строк или столбцов Series/DataFrame в pandas

Синтаксис:

DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, 
               level=None, inplace=False, errors='raise')

Series.drop(labels=None, *, index=None, level=None, 
            inplace=False, errors='raise')

Параметры:

  • labels=None - одиночная метка или список меток индекса или столбца, которые нужно удалить. Кортеж будет использоваться как отдельная метка и не будет рассматриваться как список.
  • axis=0 - ось по которой удаляются метки (0 или index) или столбцов (1 или columns). Для Series.drop() НЕ ИСПОЛЬЗУЕТСЯ.
  • index=None - одиночная метка или список меток индекса. Альтернатива указанию оси axis=0.
  • columns=None - одиночная метка или список меток столбца. Альтернатива указанию оси axis=1. Для Series.drop() НЕ ИСПОЛЬЗУЕТСЯ.
  • level=None - для MultiIndex - уровень, с которого будут удалены метки.
  • inplace=False - если значение равно False, возвратит копию. В противном случае выполнит операцию на месте и вернет None.
  • errors='raise' - Если передана строка 'ignore', то подавляется ошибка и удаляются только существующие метки.

Возвращаемое значение:

  • DataFrame.drop() возвращает DataFrame с удаленным указанным индексом или метками столбцов или None, если inplace=True.
  • Series.drop() возвращает Series с удаленным указанным индексом или None, если inplace=True.

Описание:

Метод DataFrame.drop() удаляет строки или столбцы, при указании имен меток labels и соответствующей оси axis или напрямую указав имена индексов index или столбцов columns. При использовании MultiIndex метки на разных уровнях можно удалить, указав уровень level.

Метод Series.drop() удаляет элементы Series на основе указания меток индекса labels. При использовании MultiIndex метки на разных уровнях можно удалить, указав уровень level.

Оба метода могут поднять исключение KeyError

  • для DataFrame - если какая-либо из меток не найдена на выбранной оси.
  • для Series - если какая-либо из меток не найдена в индексе.

Метод .drop(), тесно связан с переиндексацией (методом .reindex()). Он удаляет набор меток с оси:

>>> import pandas as pd
>>> import numpy as np

df = pd.DataFrame(
    {
        "one": pd.Series(np.random.randn(3), index=["a", "b", "c"]),
        "two": pd.Series(np.random.randn(4), index=["a", "b", "c", "d"]),
        "three": pd.Series(np.random.randn(3), index=["b", "c", "d"]),
    }
)

>>> df
#         one       two     three
# a  0.187290  0.112780       NaN
# b  0.070447 -0.411876  1.009604
# c -0.247133 -0.995807 -1.617450
# d       NaN  0.482486  0.502233

>>> df.drop(["a", "d"], axis=0)
#         one       two     three
# b  0.070447 -0.411876  1.009604
# c -0.247133 -0.995807 -1.617450

>>> df.drop(["one"], axis=1)
#         two     three
# a  0.112780       NaN
# b -0.411876  1.009604
# c -0.995807 -1.617450
# d  0.482486  0.502233

Обратите внимание, что следующий код также работает, но немного менее очевидно/чисто:

>>> df.reindex(df.index.difference(["a", "d"]))
#         one       two     three
# b  0.070447 -0.411876  1.009604
# c -0.247133 -0.995807 -1.617450

Примеры с DataFrame.drop():

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['A', 'B', 'C', 'D'])
>>> df
#    A  B   C   D
# 0  0  1   2   3
# 1  4  5   6   7
# 2  8  9  10  11

Удаление столбцов

Вариант 1: указываем аргументы - метки labels и ось axis

>>> df.drop(['B', 'C'], axis='columns')
#    A   D
# 0  0   3
# 1  4   7
# 2  8  11

Вариант 2: или напрямую указывает столбцы в аргументе columns

>>> df.drop(columns=['B', 'C'])
#    A   D
# 0  0   3
# 1  4   7
# 2  8  11

Удаление строк

Вариант 1: указываем аргумент - метки строк labels, ось axis по умолчанию равна 0, т.е. строка

>>> df.drop([0, 1])
#    A  B   C   D
# 2  8  9  10  11

Вариант 2: или напрямую указывает метки строк в аргументе index

>>> df.drop(index=[0, 1])
#    A  B   C   D
# 2  8  9  10  11

Удаление MultiIndex столбцов и/или строк в DataFrame

# создаем `MultiIndex`
midx = pd.MultiIndex(levels=[['llama', 'cow', 'falcon'],
                             ['speed', 'weight', 'length']],
                     codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2],
                            [0, 1, 2, 0, 1, 2, 0, 1, 2]])

# создаем `DataFrame` на `MultiIndex`
df = pd.DataFrame(index=midx, columns=['big', 'small'],
                  data=[[45, 30], [200, 100], [1.5, 1], [30, 20],
                        [250, 150], [1.5, 0.8], [320, 250],
                        [1, 0.8], [0.3, 0.2]])

>>> df
#                  big  small
# llama  speed    45.0   30.0
#        weight  200.0  100.0
#        length    1.5    1.0
# cow    speed    30.0   20.0
#        weight  250.0  150.0
#        length    1.5    0.8
# falcon speed   320.0  250.0
#        weight    1.0    0.8
#        length    0.3    0.2

Например, необходимо удалить определенную комбинацию индексов из MultiIndex, т. е. удалим комбинацию индексов falcon и weight, которая удаляет только соответствующую строку.

>>> df.drop(index=('falcon', 'weight'))
#                  big  small
# llama  speed    45.0   30.0
#        weight  200.0  100.0
#        length    1.5    1.0
# cow    speed    30.0   20.0
#        weight  250.0  150.0
#        length    1.5    0.8
# falcon speed   320.0  250.0
#        length    0.3    0.2

Теперь удалим строки с индексом cow и столбец small:

>>> df.drop(index='cow', columns='small')
#                  big
# llama  speed    45.0
#        weight  200.0
#        length    1.5
# falcon speed   320.0
#        weight    1.0
#        length    0.3

И наконец удалим строки с индексом length, который находится на первом уровне:

>>> df.drop(index='length', level=1)
#                  big  small
# llama  speed    45.0   30.0
#        weight  200.0  100.0
# cow    speed    30.0   20.0
#        weight  250.0  150.0
# falcon speed   320.0  250.0
#        weight    1.0    0.8

Примеры с Series.drop():

>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series(data=np.arange(3), index=['A', 'B', 'C'])
>>> s
# A    0
# B    1
# C    2
# dtype: int64

Удаление индексных меток строк B и C

>>> s.drop(labels=['B', 'C'])
# A    0
# dtype: int64

Удаление уровня в MultiIndex

midx = pd.MultiIndex(levels=[['llama', 'cow', 'falcon'],
                             ['speed', 'weight', 'length']],
                     codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2],
                            [0, 1, 2, 0, 1, 2, 0, 1, 2]])
s = pd.Series([45, 200, 1.2, 30, 250, 1.5, 320, 1, 0.3], index=midx)

>>> s
# llama   speed      45.0
#         weight    200.0
#         length      1.2
# cow     speed      30.0
#         weight    250.0
#         length      1.5
# falcon  speed     320.0
#         weight      1.0
#         length      0.3
# dtype: float64

Удаление метки второго уровня в серии с MultiIndex

>>> s.drop(labels='weight', level=1)
# llama   speed      45.0
#         length      1.2
# cow     speed      30.0
#         length      1.5
# falcon  speed     320.0
#         length      0.3
# dtype: float64