Перейти к содержимому

Pandas как заменить nan на среднее

  • автор:

Python Заменить значения NaN средним значением столбцов

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

Метод 1: использование Numpy.nanmean().

Пример

 import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) arr_filled = np.where(np.isnan(arr), col_means, arr) print("Column mean: ",col_means) print("Final array: \n", arr_filled) 

Выход

 Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы используем функцию numpy.nanmean() для вычисления среднего значения столбца массива numpy вместе с определенной осью (здесь ось=0 означает столбцы). Чтобы определить значение NaN в массиве, мы использовали функцию numpy.isnan() и с помощью numpy.where() заменили значение NaN средними значениями столбцов. arr_filled — это результирующее значение после замены значения NaN средним значением столбца.

Метод 2: использование обхода и среднего значения по столбцу.

Пример

 import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) for i in range(arr.shape[1]): column = arr[:, i] column_mean = np.nanmean(column) column[np.isnan(column)] = column_mean print("Column mean: ",column_mean) print("Final array: \n", arr) 

Выход

 Column mean: 2.5 Column mean: 5.0 Column mean: 7.5 Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы прошли цикл по каждому столбцу массива NumPy. Для каждого столбца мы вычисляем среднее значение столбца, используя этот столбец со средним значением. Мы присвоили значение columns_mean столбцу [np.isnan(column)].

Способ 3: использование Numpy.nan_to_num() и Numpy.mean().

Пример

 import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) arr_filled = np.nan_to_num(arr, nan=col_means) print("Column mean: ",col_means) print("Final array: \n", arr_filled) 

Выход

 Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы использовали метод numpy.nan_to_num(), который используется для замены значений NaN любым значением путем передачи значения столбца в качестве значения, которое мы хотим заменить. В результате arr_filled замененные значения столбца будут находиться вместо NaN.

Метод 4: Numpy.apply_along_axis() и среднее значение по столбцу.

Пример

 import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) def replace_nan(column): column[np.isnan(column)] = np.nanmean(column) return column arr_filled = np.apply_along_axis(replace_nan, axis=0, arr=arr) print("Column mean: ",col_means) print("Final array: \n", arr_filled) 

Выход

 Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы использовали метод numpy.apply_along_axis(), чтобы применить функцию replace_nan() к каждому столбцу массива NumPy с определенной осью (здесь ось=0 означает столбцы). Функция replace_nan() заменяет значение NaN в каждом столбце средним значением столбца.

Метод 5: Numpy.nanmean() и необычное индексирование.

Пример

 import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) mask = np.isnan(arr) arr[mask] = col_means[np.newaxis, :].repeat(arr.shape[0], axis=0)[mask] print("Column mean: ",col_means) print("Final array: \n", arr) 

Выход

 Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы использовали функцию numpy.repeat() для повторения значений столбца с массивом строк NumPy для соответствия форме исходного массива. Затем мы используем причудливую индексацию, чтобы заменить значения NaN средним значением столбца в массиве. Этот процесс не требует дополнительного места, поскольку он выполняет изменения на месте.

Метод 6: Numpy.nanmean() и вещание.

Пример

 import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) mask = np.isnan(arr) arr[mask] = col_means print("Column mean: ",col_means) print("Final array: \n", arr) 

Выход

 Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]] 

Объяснение

Здесь, в приведенном выше примере, мы использовали метод широковещания для замены значения NaN на значение столбца в массиве NumPy. В программе создается переменная mask для идентификации значений NaN, и мы присваиваем значение среднего значения столбца нужному месту в массиве.

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

Все права защищены. © Linux-Console.net • 2019-2023

Pandas: как заполнить значения NaN средним (3 примера)

Вы можете использовать функцию fillna() для замены значений NaN в кадре данных pandas.

Вот три распространенных способа использования этой функции:

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

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

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

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

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

df = df.fillna(df.mean ()) 

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

import numpy as np import pandas as pd #create DataFrame with some NaN values df = pd.DataFrame() #view DataFrame df rating points assists rebounds 0 NaN 25.0 5.0 11 1 85.0 NaN 7.0 8 2 NaN 14.0 7.0 10 3 88.0 16.0 NaN 6 4 94.0 27.0 5.0 6 5 90.0 20.0 7.0 9 6 76.0 12.0 6.0 6 7 75.0 15.0 9.0 10 8 87.0 14.0 9.0 10 9 86.0 19.0 5.0 7 

Пример 1. Заполнение значений NaN в одном столбце средним значением

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

#fill NaNs with column mean in 'rating' column df['rating'] = df['rating']. fillna(df['rating'].mean()) #view updated DataFrame df rating points assists rebounds 0 85.125 25.0 5.0 11 1 85.000 NaN 7.0 8 2 85.125 14.0 7.0 10 3 88.000 16.0 NaN 6 4 94.000 27.0 5.0 6 5 90.000 20.0 7.0 9 6 76.000 12.0 6.0 6 7 75.000 15.0 9.0 10 8 87.000 14.0 9.0 10 9 86.000 19.0 5.0 7 

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

Пример 2. Заполнение значений NaN в нескольких столбцах средним значением

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

#fill NaNs with column means in 'rating' and 'points' columns df[['rating', 'points']] = df[['rating', 'points']]. fillna(df[['rating', 'points']].mean()) #view updated DataFrame df rating points assists rebounds 0 85.125 25.0 5.0 11 1 85.000 18.0 7.0 8 2 85.125 14.0 7.0 10 3 88.000 16.0 NaN 6 4 94.000 27.0 5.0 6 5 90.000 20.0 7.0 9 6 76.000 12.0 6.0 6 7 75.000 15.0 9.0 10 8 87.000 14.0 9.0 10 9 86.000 19.0 5.0 7 

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

Пример 3. Заполнение значений NaN во всех столбцах средним значением

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

#fill NaNs with column means in each column df = df.fillna(df.mean ()) #view updated DataFrame df rating points assists rebounds 0 85.125 25.0 5.000000 11 1 85.000 18.0 7.000000 8 2 85.125 14.0 7.000000 10 3 88.000 16.0 6.666667 6 4 94.000 27.0 5.000000 6 5 90.000 20.0 7.000000 9 6 76.000 12.0 6.000000 6 7 75.000 15.0 9.000000 10 8 87.000 14.0 9.000000 10 9 86.000 19.0 5.000000 7 

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

Полную онлайн-документацию по функции fillna() можно найти здесь .

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

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

Изучаем pandas. Урок 4. Работа с пропусками в данных

Follow us on Google Plus Follow us on rss

Очень часто большие объемы данных, которые подготавливаются для последующего анализа, имеют пропуски. Для того, чтобы можно было использовать алгоритмы машинного обучения, строящие модели по этим данным, в большинстве случаев, необходимо эти пропуски чем-то и как-то заполнить. На вопрос “чем заполнять?” мы не будем отвечать в рамках данного урока, а вот на вопрос “как заполнять?” ответим.

  1. pandas и отсутствующие данные
  2. Замена отсутствующих данных
  3. Удаление объектов/столбцов с отсутствующими данными

pandas и отсутствующие данные

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

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

In [1]: import pandas as pd In [2]: from io import StringIO

После этого создадим объект в формате csv . CSV – это один из наиболее простых и распространенных форматов хранения данных, в котором элементы отделяются друг от друга запятыми, более подробно о нем можете прочитать здесь.

In [3]: data = 'price,count,percent\n1,10,\n2,20,51\n3,30,' In [4]: df = pd.read_csv(StringIO(data)) 

Полученный объект df – это DataFrame с пропусками.

In [5]: df Out[5]: price count percent 0 1 10 NaN 1 2 20 51.0 2 3 30 NaN 

В нашем примере, у объектов с индексами 0 и 2 отсутствуют данные в поле percent . Отсутствующие данные помечаются как NaN . Добавим к существующей структуре еще один объект (запись), у которого будет отсутствовать значение в поле count.

In [6]: df.loc[3] = 'price':4, 'count':None, 'percent':26.3> In [7]: df Out[7]: price count percent 0 1.0 10.0 NaN 1 2.0 20.0 51.0 2 3.0 30.0 NaN 3 4.0 NaN 26.3 

Для начала обратимся к методам из библиотеки pandas , которые позволяют быстро определить наличие элементов NaN в структурах. Если таблица небольшая, то можно использовать библиотечный метод isnull . Выглядит это так.

In [8]: pd.isnull(df) Out[8]: price count percent 0 False False True 1 False False False 2 False False True 3 False True False 

Таким образом мы получаем таблицу того же размера, но на месте реальных данных в ней находятся логические переменные, которые принимают значение False , если значение поля у объекта есть, или True , если значение в данном поле – это NaN . В дополнение к этому можно посмотреть подробную информацию об объекте, для этого можно воспользоваться методом info() .

In [9]: df.info() class 'pandas.core.frame.DataFrame'> Int64Index: 4 entries, 0 to 3 Data columns (total 3 columns): price 4 non-null float64 count 3 non-null float64 percent 2 non-null float64 dtypes: float64(3) memory usage: 128.0 bytes 

В нашем примере видно, что объект df имеет три столбца ( count , percent и price ), при этом в столбце price все объекты значимы – не NaN , в столбце count – один NaN объект, в поле percent – два NaN объекта. Можно воспользоваться следующим подходом для получения количества NaN элементов в записях.

In [10]: df.isnull().sum() Out[10]: price 0 count 1 percent 2 dtype: int64

Замена отсутствующих данных

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

In [11]: df.isnull().sum() Out[11]: price 0 count 1 percent 2 dtype: int64 In [12]: df Out[12]: price count percent 0 1.0 10.0 NaN 1 2.0 20.0 51.0 2 3.0 30.0 NaN 3 4.0 NaN 26.3 In [13]: df.fillna(0) Out[13]: price count percent 0 1.0 10.0 0.0 1 2.0 20.0 51.0 2 3.0 30.0 0.0 3 4.0 0.0 26.3 

Этот метод не изменяет текущую структуру, он возвращает структуру DataFrame , созданную на базе существующей, с заменой NaN значений на те, что переданы в метод в качестве аргумента. Данные можно заполнить средним значением по столбцу.

In [14]: df.fillna(df.mean()) Out[14]: price count percent 0 1.0 10.0 38.65 1 2.0 20.0 51.00 2 3.0 30.0 38.65 3 4.0 20.0 26.30 

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

Удаление объектов/столбцов с отсутствующими данными

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

In [15]: df.dropna() Out[15]: price count percent 1 2.0 20.0 51.0 

Вместо записей, можно удалить поля, для этого нужно вызвать метод dropna с аргументом axis=1 .

In [16]: df.dropna() Out[16]: price count percent 1 2.0 20.0 51.0 In [17]: df.dropna(axis=1) Out[17]: price 0 1.0 1 2.0 2 3.0 3 4.0 

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

In [18]: df.dropna(axis = 1, thresh=3) Out[18]: price count 0 1.0 10.0 1 2.0 20.0 2 3.0 30.0 3 4.0 NaN 

P.S.

Раздел: Pandas Python Машинное обучение и анализ данных Метки: Pandas, Python, Машинное обучение

Изучаем pandas. Урок 4. Работа с пропусками в данных : 4 комментария

  1. Карл 11.04.2018 Полезная статья, решила одну из моих проблем с кодом) Интересно будет узнать, ЧЕМ заполнять пропуски?
  1. writer 14.04.2018 В начале написал комментарий, частично повторив содержимое статьи))) Чем заполнять, определяется задачей, т.е. если можно заполнить средним значением, то заполняйте средним, если данные чувствительны к таким махинациям, то можно просто их выбросить.

Как заменить значения 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:

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

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