# Pandas dropna(): Удаление отсутствующих записей и столбцов в DataFrame

В этом уроке **вы научитесь использовать метод Pandas dropna() для удаления отсутствующих значений в DataFrame Pandas**. Работа с отсутствующими данными является одним из важных навыков при подготовке ваших данных к анализу. Поскольку очистка данных может занимать до 80% времени аналитика данных / data scientist, умение эффективно и эффективно выполнять эту работу является важным навыком.

К концу этого урока вы узнаете:

* Как эффективно использовать метод Pandas `.dropna()`
* Как удалить значения отсутствующих строк (NaN) в Pandas
* Как удалить значения отсутствующих столбцов (NaN) в Pandas
* Как использовать метод Pandas `.dropna()` только для определенных столбцов
* Как установить пороговые значения при удалении пропущенных значений в кадре данных Pandas
* Как исправить распространенные ошибки при работе с методом Pandas `.dropna()`

Оглавление

* [Понимание метода `dropna()` в Pandas](#ponimanie-metoda-dropna-v-pandas)
* [Загрузка образца DataFrame Pandas](#zagruzka-obrazca-dataframe-pandas)
* [Как удалить строки с отсутствующими данными в Pandas с помощью `.dropna()`](#kak-udalit-stroki-s-otsutstvuyushimi-dannymi-v-pandas-s-pomoshyu-.dropna)
* [Как использовать Pandas `dropna()` с подмножеством или конкретными столбцами](#kak-ispolzovat-pandas-dropna-s-podmnozhestvom-ili-konkretnymi-stolbcami)
* [Как удалить столбцы с отсутствующими данными в Pandas с помощью `.dropna()`](#kak-udalit-stolbcy-s-otsutstvuyushimi-dannymi-v-pandas-s-pomoshyu-.dropna)
* [Как установить порог пропущенных значений для удаления записей в Pandas](#kak-ustanovit-porog-propushennykh-znachenii-dlya-udaleniya-zapisei-v-pandas)
* [Удаление столбцов с заданным количеством отсутствующих записей](#udalenie-stolbcov-s-zadannym-kolichestvom-otsutstvuyushikh-zapisei)
* [Как удалить пропущенные значения в Pandas на месте](#kak-udalit-propushennye-znacheniya-v-pandas-na-meste)
* [Часто задаваемые вопросы](#chasto-zadavaemye-voprosy)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Понимание метода dropna() в Pandas

Метод `.dropna()` в Pandas является необходимым инструментом для аналитика данных или научного сотрудника любого уровня. Поскольку очистка данных является важным этапом предварительной обработки, умение работать с отсутствующими данными сделает вас более сильным программистом.

Прежде чем погружаться в использование метода, давайте уделим минуту, чтобы понять, как работает метод `.dropna()` в Pandas. Мы можем сделать это, рассмотрев параметры и аргументы по умолчанию, которые предоставляет этот метод.

```python
# Understanding the Pandas .dropna() Method
import pandas as pd
df = pd.DataFrame()

df.dropna(
   axis=0,
   how='any',
   thresh=None,
   subset=None,
   inplace=False
)
```

Мы видим, что метод `.dropna()` в Pandas предлагает пять различных параметров. Для всех этих параметров предоставлены значения по умолчанию. Это означает, что вы можете просто вызвать метод, и он будет выполнен.

**Однако понимание того, что делают различные параметры, гарантирует, что вы получите ожидаемый результат**! Давайте подробнее разберем эти параметры:

| Аргумент | Описание                                                                                                           | Значение по умолчанию | Принятые значения                   |
| -------- | ------------------------------------------------------------------------------------------------------------------ | --------------------- | ----------------------------------- |
| axis=    | Определяет, будут ли удалены строки или столбцы, если они содержат недостающие данные.                             | 0                     | {0, 1, ‘index’, ‘columns’}          |
| how=     | Определяет, должны ли в столбце или строке отсутствовать какие-либо или все значения, чтобы их можно было удалить. | ‘any’                 | {‘any’, ‘all’}                      |
| thresh=  | Сколько значений, не относящихся к NA, необходимо для удаления столбца или строки.                                 | None                  | integers                            |
| subset=  | Метки вдоль другой оси, которые следует учитывать при проверке пропущенных значений.                               | None                  | column labels or sequence of labels |
| inplace= | Завершать операцию на месте или нет.                                                                               | False                 | booleans                            |

Исходя из этих параметров, можно увидеть, что метод `.dropna()` в библиотеке Pandas предлагает большую гибкость в вопросе удаления записей с отсутствующими значениями.

Теперь, когда у вас есть четкое понимание того, что возможно с помощью этого метода, давайте перейдем к использованию метода для удаления всех строк с отсутствующими данными.

### Загрузка образца DataFrame Pandas

Чтобы следовать этому руководству, я предоставил образец DataFrame с использованием библиотеки Pandas. Если вы не используете свой собственный набор данных, не стесняйтесь копировать и вставлять приведенный ниже код в редактор кода по вашему выбору.

```python
# Loading a Sample Pandas DataFrame
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 1  Kyra   NaN  False  Canada      NaN
# 2  Kate  33.0    NaN  Canada      NaN
# 3   Nik  27.0   True     USA      NaN
# 4   NaN   NaN    NaN     NaN      NaN
```

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

### Как удалить строки с отсутствующими данными в Pandas с помощью .dropna()

Метод `dropna()` в Pandas позволяет легко удалить все строки с отсутствующими данными. По умолчанию метод `dropna()` удалит любую строку с хотя бы одним отсутствующим значением. Это связано с тем, что параметр `how=` установлен в значение `'any'`, а параметр `axis=` — в значение `0`.

Давайте посмотрим, что произойдет, когда мы применим метод `.dropna()` к нашему DataFrame:

```python
# Applying the .dropna() Method to Our DataFrame
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna()

print(df.head())

# Returns:
# Empty DataFrame
# Columns: [Name, Age, Active, Country, Missing]
# Index: []
```

Все записи в нашем DataFrame содержат пропущенное значение, поэтому все записи в нашем DataFrame удаляются.

**Мы можем изменить поведение функции так, чтобы удалялись записи, где отсутствуют все значения, передавая `how='all'`**. Давайте посмотрим, как это будет выглядеть:

```python
# Dropping Records using .dropna() If All Records Are Missing
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(how='all')

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 1  Kyra   NaN  False  Canada      NaN
# 2  Kate  33.0    NaN  Canada      NaN
# 3   Nik  27.0   True     USA      NaN
```

Путем изменения поведения метода нам удалось настроить Pandas на удаление записей, где отсутствуют _все_ значения.

В следующем разделе вы узнаете, как настроить Pandas на проверку отсутствующих записей только в некоторых столбцах.

### Как использовать Pandas dropna() с подмножеством или конкретными столбцами

Pandas позволяет легко использовать метод `.dropna()` для проверки только подмножества столбцов или конкретного столбца. Это может быть чрезвычайно полезно, когда некоторые столбцы более критичны для вашего анализа, чем другие.

Чтобы указать, какие столбцы нужно проверить, можно использовать параметр `subset=`, который принимает либо один ярлык столбца, либо список ярлыков столбцов.

Давайте посмотрим, как мы можем сначала проверить наличие только пропущенных значений в одном столбце, столбце `'Age'`

```python
# Dropping Records in Pandas Using .dropna() Based on a Single Column
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(subset='Age')

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 2  Kate  33.0    NaN  Canada      NaN
# 3   Nik  27.0   True     USA      NaN
```

В приведенном выше блоке кода мы передали одну строку в параметр `subset=`. Поскольку мы хотели проверить только наличие отсутствующих значений в одном столбце, строка подошла. В этом случае Pandas проигнорировал наличие отсутствующих значений в других столбцах.

Чтобы проверить наличие пропущенных значений в нескольких столбцах, необходимо передать список (или последовательность) меток столбцов в параметр `subset=`. Давайте посмотрим, как мы можем проверить наличие пропущенных значений в столбцах `'Age'` и `'Active'`

```python
# Dropping Records in Pandas Using .dropna() Based on Multiple Columns
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(subset=['Age', 'Active'])

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 3   Nik  27.0   True     USA      NaN
```

В этом случае мы смогли проверить наличие пропущенных записей в двух столбцах. В следующем разделе вы узнаете, как удалить столбцы с отсутствующими данными в DataFrame Pandas.

### Как удалить столбцы с отсутствующими данными в Pandas с помощью .dropna()

Удаление столбцов в DataFrame Pandas работает очень похожим образом на удаление записей. Для этого мы просто устанавливаем параметр `axis=` либо в значение `1`, либо в `'columns'`. Хотя удаление столбцов на основе отсутствующих данных, возможно, является менее распространенной задачей, важно знать, как это сделать.

Давайте посмотрим, что произойдет, если мы передадим `axis=1` в наш вызов метода `.dropna()`

```python
# Dropping All Columns with Missing Data
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(axis=1)

print(df.head())

# Returns:
# Empty DataFrame
# Columns: []
# Index: [0, 1, 2, 3, 4]
```

Поскольку в каждом столбце были пропущенные данные, все столбцы были удалены. На данный момент осталась только пустая таблица DataFrame и индексы.

Мы можем изменить поведение так, чтобы удалялись только те столбцы, в которых отсутствуют все значения, передав параметр `how='any'`.

```python
# Dropping Columns with All Missing Data
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(axis=1, how='all')

print(df.head())

# Returns:
#    Name   Age Active Country
# 0  Evan  36.0   True     USA
# 1  Kyra   NaN  False  Canada
# 2  Kate  33.0    NaN  Canada
# 3   Nik  27.0   True     USA
# 4   NaN   NaN    NaN     NaN
```

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

Во многих случаях вам потребуется удалить записи или столбцы, основываясь на некотором пороге значений – именно это вы узнаете в следующем разделе.

### Как установить порог пропущенных значений для удаления записей в Pandas

Используя параметр `thresh=`, вы можете установить минимальное количество значений, которые должны быть не пропущенными, чтобы запись была удалена. Это позволяет вам указать, какое минимальное количество данных должна иметь каждая запись, чтобы она была сохранена в наборе данных.

Используя метод `.dropna()` в Pandas, который по умолчанию удаляет записи, мы можем применить параметр `thresh=`, чтобы задать наш метод. Давайте посмотрим, как мы можем указать, что нам нужно как минимум четыре данные на запись:

```python
# Setting a Minimum Threshold for Keeping Records
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(thresh=4)

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 3   Nik  27.0   True     USA      NaN
```

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

### Удаление столбцов с заданным количеством отсутствующих записей

Подобно приведенному выше примеру, вы можете захотеть удалить целые столбцы, если отсутствует определенное количество записей. Поскольку мы можем использовать метод `.dropna()` также для удаления столбцов, мы можем сочетать его с параметром `thresh=`, чтобы удалять столбцы.

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

Давайте посмотрим, как можно удалить столбцы, в которых не менее 4 непустых данных:

```python
# Dropping Columns Based on Missing Data
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(axis=1, thresh=4)

print(df.head())

# Returns:
#    Name Country
# 0  Evan     USA
# 1  Kyra  Canada
# 2  Kate  Canada
# 3   Nik     USA
# 4   NaN     NaN
```

Во многих случаях, однако, **вы захотите удалять столбцы на основе процента отсутствующих значений**. Мы можем сделать это, используя тот же метод, но просто вычислив значение непосредственно при вызове метода.

Давайте посмотрим, как мы можем удалять столбцы, где пропущено как минимум 10% значений:

```python
# Dropping Columns Where At Least 10% of Values are Missing
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df = df.dropna(axis=1, thresh=int(0.9*len(df)))

print(df.head())

# Returns:
#    Name Country
# 0  Evan     USA
# 1  Kyra  Canada
# 2  Kate  Canada
# 3   Nik     USA
# 4   NaN     NaN
```

В приведенном выше примере мы рассчитываем параметр `thresh=` непосредственно в вызове метода, находя минимальное количество непустых записей. Поскольку параметр `thresh=` учитывает количество непустых записей, мы умножаем длину DataFrame на `1 - percentage`

### Как удалить пропущенные значения в Pandas на месте

В приведенных выше примерах мы удаляли записи или столбцы, повторно присваивая DataFrame самому себе. Однако, если вы хотите удалить записи или столбцы на месте, вы можете сделать это, установив `inplace=True`.

Изменяя DataFrame на месте, метод не возвращает ничего. Вместо этого он изменяет сам DataFrame.

Давайте посмотрим, как мы можем удалить строки с отсутствующими записями, где все данные отсутствуют, на месте:

```python
# Dropping Records in a DataFrame In Place
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Evan', 'Kyra', 'Kate', 'Nik', np.NaN],
    'Age': [36, np.NaN, 33, 27, np.NaN],
    'Active': [True, False, np.NaN, True, np.NaN],
    'Country': ['USA', 'Canada', 'Canada', 'USA', np.NaN],
    'Missing': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})

df.dropna(how='all', inplace=True)

print(df.head())

# Returns:
#    Name   Age Active Country  Missing
# 0  Evan  36.0   True     USA      NaN
# 1  Kyra   NaN  False  Canada      NaN
# 2  Kate  33.0    NaN  Canada      NaN
# 3   Nik  27.0   True     USA      NaN
```

В приведенном выше блоке кода мы удалили записи на месте. Это позволяет избежать необходимости повторного присваивания DataFrame самому себе.

### Часто задаваемые вопросы

<details>

<summary>Что делает Pandas dropna?</summary>

Метод `.dropna()` библиотеки Pandas используется для удаления записей или столбцов, содержащих отсутствующие данные. Этот метод предоставляет гибкость в отношении способов удаления записей.

</details>

<details>

<summary>Почему Pandas dropna не работает?</summary>

Метод `.dropna()` в Pandas может не работать, если DataFrame не переназначен сам на себя или если метод не используется с параметром `inplace`. Если вы не удаляете значения на месте, вам нужно переназначить DataFrame самому себе.

</details>

<details>

<summary>Как я могу сбросить индекс DataFrame при использовании Pandas dropna?</summary>

Метод `.dropna()` не предлагает опцию для сброса индекса. Однако вы можете выполнить сброс индекса, используя метод `.reset_index()`. Например, вы можете написать: `df.dropna().reset_index()`.

</details>

### Заключение

В этом посте вы узнали, как использовать метод `.dropna()` библиотеки Pandas для удаления записей или столбцов с отсутствующими данными в DataFrame. Сначала вы узнали о различных параметрах, доступных в этом методе. Затем вы научились использовать этот метод для удаления записей с отсутствующими данными, а также столбцов с отсутствующими данными. После этого вы научились использовать метод для удаления записей на основе порогового значения неотсутствующих значений и как модифицировать DataFrame на месте.

### Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с обучающими материалами ниже:

* Pandas Fillna – Работа с пропущенными значениями
* Введение в Pandas для науки о данных
* Очистка и подготовка данных в Pandas и Python
* Подсчет значений в Pandas с помощью value\_counts
* [Pandas dropna: официальная документация](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html)
