我正在尝试使用
fillna()
函数替换数据帧列“功能”中的 nan 值。我面临的问题如下:
isnull()
dfcomp[dfcomp['Functional'].isnull()==True]
dfcomp['Functional'][2216]
fillna()
填充 nan 时,什么也没有发生。即使在运行 fillna 语句之后,我也可以重新运行第一个语句并看到相同的 2 个 nan 实例。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()
替换相同的值时却没有结果?
当我的
fillna()
无法识别时,如何替换 nan 值?
本质上问题是
dfcomp['Functional'].mode()
的返回类型
这是一个单个元素 pandas.Series
,并且 fillna()
需要一个 标量或与您尝试填充的列具有相同长度的 dict/Series/DataFrame。
您需要计算列的众数,然后将标量传递给
fillna()
方法。
mode = dfcomp['Functional'].mode().values[0]
dfcomp['Functional'].fillna(value=mode, inplace=True)
这是一个
Index
对齐问题。 pd.Series.mode
始终返回 Series,即使只返回一个值。因此,该系列的索引是 RangeIndex
(最多为与模式相关的值的数量),因此当您使用 .fillna
时,它会尝试在索引上对齐,而索引大多与您的 DataFrame 不对齐。
您想要选择模态 值,因此使用
.iloc
dfcomp['Functional'] = dfcomp['Functional'].fillna(dfcomp['Functional'].mode().iloc[0])
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
为了填充 NaN 值,可以使用以下代码:
dfcomp = dfcomp.fillna(value=0)
稍后更新:
dfcomp['Functional'] = dfcomp['Functional'].fillna(dfcomp['mode'])