Как заменить nan на 0 pandas
Перейти к содержимому

Как заменить nan на 0 pandas

  • автор:

Pandas: как заменить значения NaN строкой

Вы можете использовать следующие методы для замены значений NaN строками в кадре данных pandas:

Метод 1: заменить значения NaN строкой во всем кадре данных

df.fillna('', inplace= True ) 

Способ 2: заменить значения NaN строкой в определенных столбцах

df[['col1', 'col2']] = df[['col1',' col2']]. fillna('') 

Способ 3: заменить значения NaN на строку в одном столбце

df.col1 = df.col1.fillna('') 

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

import pandas as pd import numpy as np #create DataFrame with some NaN values df = pd.DataFrame() #view DataFrame df team points assists rebounds 0 A NaN 5.0 11.0 1 A 11.0 NaN 8.0 2 A 7.0 7.0 10.0 3 A 7.0 9.0 NaN 4 B 8.0 12.0 6.0 5 B 6.0 9.0 5.0 6 B 14.0 9.0 9.0 7 B 15.0 4.0 NaN 

Метод 1: заменить значения NaN строкой во всем кадре данных

В следующем коде показано, как заменить каждое значение NaN во всем DataFrame пустой строкой:

#replace NaN values in all columns with empty string df.fillna('', inplace= True ) #view updated DataFrame df team points assists rebounds 0 A 5.0 11.0 1 A 11.0 8.0 2 A 7.0 7.0 10.0 3 A 7.0 9.0 4 B 8.0 12.0 6.0 5 B 6.0 9.0 5.0 6 B 14.0 9.0 9.0 7 B 15.0 4.0 

Обратите внимание, что каждое значение NaN в каждом столбце было заменено пустой строкой.

Способ 2: заменить значения NaN строкой в определенных столбцах

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

#replace NaN values in 'points' and 'rebounds' columns with 'none' df[['points', 'rebounds']] = df[['points', 'rebounds']]. fillna('none') #view updated DataFrame df team points assists rebounds 0 A none 5.0 11.0 1 A 11.0 NaN 8.0 2 A 7.0 7.0 10.0 3 A 7.0 9.0 none 4 B 8.0 12.0 6.0 5 B 6.0 9.0 5.0 6 B 14.0 9.0 9.0 7 B 15.0 4.0 none 

Обратите внимание, что значения NaN в столбцах «очки» и «подборы» были заменены строкой «нет», но значения NaN в столбце «ассисты» остались неизменными.

Способ 3: заменить значения NaN на строку в одном столбце

В следующем коде показано, как заменить значения NaN в одном столбце определенной строкой:

#replace NaN values in 'points' column with 'zero' df.points = df.points.fillna('zero') #view updated DataFrame df team points assists rebounds 0 A zero 5.0 11.0 1 A 11.0 NaN 8.0 2 A 7.0 7.0 10.0 3 A 7.0 9.0 NaN 4 B 8.0 12.0 6.0 5 B 6.0 9.0 5.0 6 B 14.0 9.0 9.0 7 B 15.0 4.0 NaN 

Обратите внимание, что значение NaN в столбце «Очки» было заменено строкой «ноль», но значения NaN в столбцах «Ассисты» и «Подборы» остались без изменений.

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

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

Как заменить значения NaN на ноль в Pandas

Вы можете использовать следующие методы для замены значений NaN нулями в кадре данных pandas:

Метод 1: заменить значения NaN на ноль в одном столбце

df['col1'] = df['col1']. fillna (0) 

Способ 2: заменить значения NaN на ноль в нескольких столбцах

df[['col1', 'col2']] = df[['col1', 'col2']]. fillna (0) 

Способ 3: заменить значения NaN на ноль во всех столбцах

df = df.fillna(0) 

В следующих примерах показано, как использовать каждый из этих методов со следующими пандами DataFrame:

import pandas as pd import numpy as np #create DataFrame df = pd.DataFrame() #view DataFrame print(df) points assists rebounds 0 25.0 5.0 11.0 1 NaN NaN 8.0 2 15.0 7.0 10.0 3 14.0 NaN 6.0 4 19.0 12.0 6.0 5 23.0 9.0 NaN 6 25.0 9.0 9.0 7 29.0 4.0 NaN 

Метод 1: заменить значения NaN на ноль в одном столбце

В следующем коде показано, как заменить значения NaN на ноль только в столбце «помощь»:

#replace NaN values with zero in 'assists' column df['assists'] = df['assists']. fillna (0) #view updated DataFrame print(df) points assists rebounds 0 25.0 5.0 11.0 1 NaN 0.0 8.0 2 15.0 7.0 10.0 3 14.0 0.0 6.0 4 19.0 12.0 6.0 5 23.0 9.0 NaN 6 25.0 9.0 9.0 7 29.0 4.0 NaN 

Обратите внимание, что значения NaN в столбце «ассисты» были заменены нулями, но значения NaN во всех остальных столбцах остались прежними.

Способ 2: заменить значения NaN на ноль в нескольких столбцах

В следующем коде показано, как заменить значения NaN на ноль в столбцах «баллы» и «ассисты»:

#replace NaN values with zero in 'points' and 'assists' column df[['points', 'assists']] = df[['points', 'assists']]. fillna (0) #view updated DataFrame print(df) points assists rebounds 0 25.0 5.0 11.0 1 0.0 0.0 8.0 2 15.0 7.0 10.0 3 14.0 0.0 6.0 4 19.0 12.0 6.0 5 23.0 9.0 NaN 6 25.0 9.0 9.0 7 29.0 4.0 NaN 

Способ 3: заменить значения NaN на ноль во всех столбцах

В следующем коде показано, как заменить значения NaN нулем в каждом столбце DataFrame:

#replace NaN values with zero in all columns df = df.fillna(0) #view updated DataFrame print(df) points assists rebounds 0 25.0 5.0 11.0 1 0.0 0.0 8.0 2 15.0 7.0 10.0 3 14.0 0.0 6.0 4 19.0 12.0 6.0 5 23.0 9.0 0.0 6 25.0 9.0 9.0 7 29.0 4.0 0.0 

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

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

Замена значений на NaN

Работаю с таблицей данных, в которых есть как положительные, так и отрицательные значения. Как в определённом столбце заменить все положительные значения на NaN ? Пробовал так:

df.loc[df['days_employed'] > 0, 'days_employed'] = "NaN" 

Но мне выдало ошибку.
Отслеживать
51.6k 204 204 золотых знака 67 67 серебряных знаков 252 252 бронзовых знака
задан 20 янв 2021 в 14:20
137 3 3 серебряных знака 10 10 бронзовых знаков

Я почти не знаком с питоном, но можно ли хранить в данной таблице значения типа NaN? Но полагаю, что в ячейку таблицы нельзя записать данный тип данных. Возможно стоит конвертировать в строку данное значение и только потом писать

20 янв 2021 в 14:27

Приведите пожалуйста в вопросе небольшой, но воспроизводимый пример входных данных (в виде текста / CSV / Python кода или ссылки на файл) и то что вы ожидаете получить на выходе. Также советую ознакомиться: Как наиболее эффективно задать вопрос, связанный с обработкой и/или анализом данных (например: по Pandas / Numpy / SciPy / SciKit Learn / SQL)

20 янв 2021 в 14:40

у меня есть таблица, где в одном столбце (‘days_employed’) хранятся данные в о стаже огромного кол-ва сотрудников. тип данных float64. Но данные есть как положительные числа так и отрицательные. Задача состоит в том, что все положительные числа заменить на NaN, т.е. чтобы остались только либо NaN либо отрицательное числа

20 янв 2021 в 15:01
@АртёмКрашенинников, для таких данных этот ответ должен подойти
20 янв 2021 в 16:13

А что за ошибку то выдаёт? Я попробовал в Google Colab, всё прекрасно работает, никакой ошибки не выдаёт. Разве что NaN у вас текстовый получается, но сама эта строка ошибок не содержит.

20 янв 2021 в 16:15

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

In [54]: df Out[54]: a b 0 1 2 1 -1 3 2 0 4 3 5 -1 In [55]: df.loc[df["a"].gt(0), "a"] = np.nan In [56]: df Out[56]: a b 0 NaN 2 1 -1.0 3 2 0.0 4 3 NaN -1 

Отслеживать
ответ дан 20 янв 2021 в 14:42
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 133 133 бронзовых знака

Вообще ошибки быть никакой не должно, за исключением случая, когда вы пытаетесь проделать эту операцию несколько раз (либо если у вас в столбце уже были строковые данные по какой-то причине):

df.loc[df['days_employed'] > 0, 'days_employed'] = "NaN" df.loc[df['days_employed'] > 0, 'days_employed'] = "NaN" 
TypeError: '>' not supported between instances of 'str' and 'int' 

Если использовать np.nan , что более правильно, ошибки не будет:

df.loc[df['days_employed'] > 0, 'days_employed'] = np.nan df.loc[df['days_employed'] > 0, 'days_employed'] = np.nan 

Разницы между > 0 и .gt(0) никакой нет.

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

Давайте рассмотрим распространенную проблему с пропущенными данными и способы ее решения.

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

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

Таблица 1: Пример набора данных о машинах

Давайте сначала создадим датафрейм для примера:

import pandas as pd # Создание DataFrame data = < 'Марка': ['Toyota', 'Honda', 'Ford', 'Subaru', 'Hyundai', 'Nissan'], 'Модель': ['Corolla', 'Civic', 'Mustang', 'Outback', 'Elantra', 'Sentra'], 'Год выпуска': [2019, 2020, 2018, 2017, 2021, 2019], 'Цена': [15000, 17000, 25000, None, 18000, 15500], 'Нормализованные потери': [134, None, 235, 178, 156, 170], 'Тип топлива': ['Бензин', 'Дизель', None, 'Бензин', 'Гибрид', 'Бензин'] >df = pd.DataFrame(data)

Как обработать пропущенные данные?

Каждая ситуация уникальна, и подход к ней должен быть индивидуальным. Давайте начнем с восстановления данных.

1 Способ: Восстановление данных

Самый лучший способ, конечно, восстановить данные, если у вас есть доступ к дополнительной информации. Этот способ обеспечивает наиболее точные результаты.

Например, если вам известно, что пропущенное значение нормализованных потерь для Honda Civic составляет 150, то вы можете его восстановить.

Сделать это можно так:

#Заполнение пропущенных значений на основе дополнительной информации df.loc[df['Модель'] == 'Outback', 'Цена'] = 17625 df.loc[df['Модель'] == 'Civic', 'Потери'] = 150 df.loc[df['Модель'] == 'Mustang', 'Тип топлива'] = 'Дизель'

Таблица 2: Набор данных с заполненными пропущенными значениями

2 Способ: Удаление данных

Но, к сожалению, не всегда данные можно восстановить из источника.

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

Это способ будет актуальным, если у вас много данных и небольшое количество пропусков.

# Удаление строк с пропущенными значениями в столбце "Цена" df = df.dropna(subset=['Цена'])

Таблица 3: Набор данных с удаленными строками, содержащими пропущенные значения

3 Способ: замена пропущенных значений средним

Еще один из стандартных методов — замена пропущенных значений средним значением по переменной.

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

# Замена пропущенных значений средними значениями df['Цена'].fillna(df['Цена'].mean(), inplace=True) df['Нормализованные потери'].fillna(df['Нормализованные потери'].mean(), inplace=True)

Таблица 4: Набор данных с замененными пропущенными значениями средними значениями

На самом деле, хитростей много. И это не единственный практический пример. Например, в Симуляторе «Аналитик данных» от Simulative мы разбираем просто кучу реальных кейсов.

4 Способ: Оставить все, как есть

Но что, если эти значения нельзя усреднить, как в случае с категориальными переменными?

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

# Замена пропущенных значений в столбце "Тип топлива" на наиболее часто встречающееся значение mode_fuel_type = df['Тип топлива'].mode()[0] # Вычисление моды (наиболее часто встречающегося значения) df['Тип топлива'].fillna(mode_fuel_type, inplace=True)

Таблица 5: Набор данных с заменой пропущенных значений в столбце «Тип топлива»

В этом примере мы заменили пропущенные значения в столбце «Тип топлива» на наиболее часто встречающееся значение, которое в данном случае является «Бензин».

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

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

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

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

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

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

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