我正在尝试使用fillna()
函数替换数据框“ Functional”列中的nan值。我面临的问题如下:
isnull()
dfcomp[dfcomp['Functional'].isnull()==True]
dfcomp['Functional'][2216]
fillna()
来填充nan时,什么也没发生。即使在运行fillna语句之后,我也可以重新运行第一条语句并看到相同的2个nan实例。 dfcomp['Functional']=dfcomp['Functional'].fillna(value=dfcomp['Functional'].mode())
我尝试了两个版本btw
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()
替换相同的值时却没有结果?
当我的0 0/3 * * * *
无法识别时,如何替换nan值?
答案 0 :(得分:1)
本质上,问题在于dfcomp['Functional'].mode()
的返回类型
这个单个元素pandas.Series
和fillna()
期望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])
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