Как я могу заменить все значения NaN на Zero в столбце pandas dataframe

У меня есть dataframe, как показано ниже

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

когда я пытаюсь применить функцию к столбцу Сумма, я получаю следующую ошибку.

ValueError: cannot convert float NaN to integer

Я попытался применить функцию, используя .isnan из Math Module Я пробовал атрибут pandas.replace Я попробовал атрибут data.sparse от pandas 0.9 Я также пробовал, если NaN == NaN выражение в функции. Я также рассмотрел эту статью Как заменить значения NA нулями в фреймворке R?, глядя на некоторые другие статьи. Все методы, которые я пробовал, не работали или не признавали NaN. Любые подсказки или решения будут оценены.

Ответ 1

Я верю, что DataFrame.fillna() сделает это за вас.

Ссылка на Документы для dataframe и a.

Пример:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

Чтобы заполнить NaN только в одном столбце, выберите именно этот столбец. в этом случае я использую inplace = True для фактического изменения содержимого df.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000

Ответ 2

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

df['column'] = df['column'].fillna(value)

Ответ 3

Вы можете использовать replace, чтобы изменить NaN на 0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)

Ответ 4

Я просто хотел предоставить немного обновления/специального случая, так как похоже, что люди все еще приходят сюда. Если вы используете мультииндекс или иным образом используете индексный слайсер, параметр inplace = True может оказаться недостаточным для обновления выбранного вами среза. Например, в мультииндексе уровня 2x2 это не изменит никаких значений (от pandas 0,15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

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

Решение - DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

Это одна строка, достаточно хорошо читаемая (вроде) и устраняет ненужные беспорядки с промежуточными переменными или циклами, позволяя вам применять fillna к любому многоуровневому фрагменту, который вам нравится!

Если кто-то может найти места, это не сработает, напишите в комментариях, я возился с ним и смотрел на источник, и он, кажется, решает хотя бы мои проблемы с несколькими индексами.

Ответ 5

Следующий код работал у меня.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)

Ответ 6

Простой способ заполнить пропущенные значения: -

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

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

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

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

заполнение NaN с нуля:

df['column name'].fillna(0, inplace = True)

Ответ 7

fillna() - лучший способ сделать это. Код -

#fill all Nan value with zero
df = df.fillna(0)

Вы также можете использовать inplace, если вы не хотите использовать 'df = df.fillna(value)'. Код -

df.fillna(0, inplace=True)

Ответ 8

Вы должны использовать fillna(). Меня устраивает.

df = df.fillna(value_to_replace_null)

Ответ 9

enter image description here

Учитывая, что конкретный столбец Amount в приведенной выше таблице имеет целочисленный тип. Следующее будет решением:

df['Amount'] = df.Amount.fillna(0).astype(int)

Точно так же вы можете заполнить его различными типами данных, такими как float, str и так далее.

В частности, я хотел бы рассмотреть тип данных для сравнения различных значений одного и того же столбца.

Ответ 10

Заменить значения в пандах

df['column_name'].fillna(value_to_be_replaced,inplace=True)

если inplace = False, вместо обновления df (dataframe) он вернет измененные значения.

Ответ 11

Если вы хотите преобразовать его в fillna, вы также можете сделать это с помощью fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

Это вернет следующее:

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0

Ответ 12

Вы также можете использовать словари, чтобы заполнить значения NaN определенных столбцов в DataFrame, а не заполнить все DF некоторым значением oneValue.

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)

Ответ 13

Есть два варианта, доступных в первую очередь; в случае вменения или заполнения пропущенных значений NaN/np.nan только числовыми заменами (по столбцу (столбцам)):

df['Amount'].fillna(value=None, method= ,axis=1,) достаточно:

Из документации:

value: скаляр, dict, Series или DataFrame Значение, используемое для заполнения отверстий (например, 0), поочередно dict/Series/DataFrame значений, указывающих, какое значение использовать для каждого индекса (для Series) или столбца (для DataFrame), (значения, не указанные в dict/Series/DataFrame, заполняться не будут). Это значение не может быть списком.

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

Для более специализированных вменений используйте SimpleImputer():

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])