fillna不替换数据框中的nan值

时间:2019-10-30 18:19:46

标签: python pandas dataframe nan fillna

我正在尝试使用fillna()函数替换数据框“ Functional”列中的nan值。我面临的问题如下:

  1. 我能够使用isnull()
  2. 检测空值

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

search for null values

  1. 使用上述索引,我搜索了实际值

dfcomp['Functional'][2216]

value search using the index

  1. 但是当我尝试使用fillna()来填充nan时,什么也没发生。即使在运行fillna语句之后,我也可以重新运行第一条语句并看到相同的2个nan实例。

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

我尝试了两个版本btw

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

The fillna()

  1. 我也尝试使用replace()函数,但是没有运气

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

我的代码有问题吗?为什么fillna()不能识别nanisnull()不能识别nan? 同样为什么索引搜索将值显示为replace(),但是当我尝试使用fillna()替换相同的值时却没有结果?

当我的0 0/3 * * * *无法识别时,如何替换nan值?

3 个答案:

答案 0 :(得分:1)

本质上,问题在于dfcomp['Functional'].mode()的返回类型 这个单个元素pandas.Seriesfillna()期望scalar or a dict/Series/DataFrame的长度与您要填充的列的长度相同。

您需要计算列的模式,然后将标量传递给fillna()方法。

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

答案 1 :(得分:0)

为了填充NaN值,您可以使用以下代码:

dfcomp = dfcomp.fillna(value=0)

最新更新:

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

答案 2 :(得分:0)

这是一个Index对齐问题。 pd.Series.mode 即使仅返回一个值,总是返回系列。因此,该系列的索引是RangeIndex(最多取决于该模式的值),因此当您使用.fillna时,它会尝试与Index对齐,而Index大多与您的对齐数据框。

您要选择模式,因此请使用.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