Pandas как заменить nan

4 года назад

Arthur Cheremisin

Ответы

0

Для замены значений NaN в pandas можно использовать методы fillna() или replace().

Метод fillna() позволяет заменить все значения NaN определенным значением, например:

1
2
3
4
5
6
7
8
9
import pandas as pd

# Создаем датафрейм с NaN значениями
df = pd.DataFrame({'A': [1, 2, None, 4, 5], 'B': [None, 2, 3, None, 5]})

# Заменяем все значения NaN на 0
df.fillna(0, inplace=True)

print(df)

Метод replace() позволяет заменить конкретное значение (в том числе и NaN) на другое значение, например:

1
2
3
4
5
6
7
8
9
import pandas as pd

# Создаем датафрейм с NaN значениями
df = pd.DataFrame({'A': [1, 2, None, 4, 5], 'B': [None, 2, 3, None, 5]})

# Заменяем значение NaN в столбце A на 0
df['A'].replace([None], 0, inplace=True)

print(df)

Если вы хотите заменить NaN только в определенных столбцах или строках, вы можете указать параметр subset при использовании метода fillna().

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

2 года назад

Ivan Mamtsev

0

Пропуски в pandas заменяют методом fillna():

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Аня', 'Боря', None],
    'age': [25, np.nan, 31],
    'city': ['Москва', np.nan, 'Казань'],
})

df = df.fillna(0)

Все NaN и None станут нулями.

Разные значения для разных столбцов

1
df = df.fillna({'age': 0, 'city': 'не указан', 'name': 'аноним'})

Средним, медианой или самым частым значением

1
2
3
df['age'] = df['age'].fillna(df['age'].mean())
df['age'] = df['age'].fillna(df['age'].median())
df['city'] = df['city'].fillna(df['city'].mode()[0])

Медиана меньше зависит от выбросов, чем среднее. Для текстовых столбцов подходит мода — самое частое значение.

Предыдущим или следующим значением

1
2
df['price'] = df['price'].ffill()  # взять значение из строки выше
df['price'] = df['price'].bfill()  # взять значение из строки ниже

Так заполняют временные ряды. Запись fillna(method='ffill') устарела и в новых версиях pandas выдаёт предупреждение.

Плавно между соседями

1
df['temp'] = df['temp'].interpolate()

Между 10 и 20 с одним пропуском получится 15.

Почему fillna не сработал

Метод возвращает новую таблицу и не меняет исходную. Результат нужно присвоить:

1
2
df['age'].fillna(0)               # df не изменится
df['age'] = df['age'].fillna(0)   # так правильно

inplace=True на отдельном столбце (df['age'].fillna(0, inplace=True)) в pandas 2.x выдаёт предупреждение и в будущих версиях перестанет работать.

Пропуски, которые не NaN

Пустые строки и слова вроде '-' pandas пропусками не считает. Сначала превратите их в NaN:

1
df = df.replace(['', '-', 'n/a'], np.nan)

При чтении CSV это можно сделать сразу: pd.read_csv('data.csv', na_values=['-', 'n/a']).

Посчитать пропуски перед заменой

1
df.isna().sum()

Покажет число пропусков в каждом столбце.

Удалить строки с пропусками

1
2
df = df.dropna()                 # строки, где есть хоть один пропуск
df = df.dropna(subset=['age'])   # только где нет возраста

replace

1
df = df.replace(np.nan, 0)

Работает как fillna(0). Пригодится, когда в одной команде нужно заменить и NaN, и другие значения.

Pandas и подготовку данных к анализу разбирают в курсе «Python для аналитиков данных».

день назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845