Как я могу заменить все значения 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']])