fillna не заменяет значения nan в кадре данных - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь заменить значения nan в столбце данных «Функциональные», используя функцию fillna(). Ниже перечислены проблемы, с которыми я сталкиваюсь:

  1. Я могу определить нулевые значения, используя isnull()

dfcomp[dfcomp['Functional'].isnull()==True]

поиск нулевых значений

используя вышеуказанный индекс, я искал фактическое значение

dfcomp['Functional'][2216]

Поиск значения с использованием индекса

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

dfcomp['Functional']=dfcomp['Functional'].fillna(value=dfcomp['Functional'].mode())

Я пробовал обе версии, кстати

dfcomp['Functional'].fillna(value=dfcomp['Functional'].mode(),inplace=True)

Заполнение ()

Я также пытался использовать для этого функцию replace(), но не повезло

dfcomp['Functional']=dfcomp['Functional'].replace({'nan':dfcomp['Functional'].mode()})

Что-то не так с моим кодом? почему fillna() не распознает nan, когда isnull() может это сделать? Кроме того, почему при поиске по индексу значение отображается как nan, но когда я пытаюсь заменить это же значение с помощью replace(), результата нет?

Как заменить значения nan, если мой fillna()не в состоянии распознать это?

Ответы [ 3 ]

1 голос
/ 30 октября 2019

По существу, проблема заключается в типе возврата dfcomp['Functional'].mode(). Этот единственный элемент pandas.Series и fillna() ожидают либо скаляр, либо dict / Series / DataFrame того же объектива, что и столбецВы пытаетесь заполнить.

Вам необходимо вычислить режим столбца и затем передать скаляр в метод fillna().

mode = dfcomp['Functional'].mode().values[0]
dfcomp['Functional'].fillna(value=mode, inplace=True)
0 голосов
/ 30 октября 2019

Это проблема выравнивания Index. pd.Series.mode всегда возвращает серию , даже если возвращается только одно значение. Таким образом, индекс этой серии равен RangeIndex (до количества значений, привязанных к режиму), поэтому при использовании .fillna он пытается выровнять по индексу, который в основном не соответствует вашему DataFrame.

Вы хотите выбрать модальное значение , поэтому используйте .iloc

dfcomp['Functional'] = dfcomp['Functional'].fillna(dfcomp['Functional'].mode().iloc[0])

MCVE

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({'foo': np.random.choice([1,2,3,np.NaN], 7)})

df['foo'].mode()
#0    3.0
#dtype: float64

# Nothing gets filled because only the row with Index 0 could possibly
# be filled and it wasn't missing to begin with
df['foo'].fillna(df['foo'].mode())
#0    3.0
#1    NaN
#2    1.0
#3    3.0
#4    3.0
#5    NaN
#6    1.0
#Name: foo, dtype: float64

# This fills the `NaN` with 3 regardless of index
df['foo'].fillna(df['foo'].mode().iloc[0])
#0    3.0
#1    3.0
#2    1.0
#3    3.0
#4    3.0
#5    3.0
#6    1.0
#Name: foo, dtype: float64
0 голосов
/ 30 октября 2019

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

dfcomp = dfcomp.fillna(value=0)

Позднее обновление:

dfcomp['Functional'] = dfcomp['Functional'].fillna(dfcomp['mode'])

...