为什么带有模式的 fillna 没有替换数据框中的 nan 值?

问题描述 投票:0回答:3

我正在尝试使用

fillna()
函数替换数据帧列“功能”中的 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())

我已经尝试了两个版本

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

The fillna()

  1. 我也尝试使用
    replace()
    函数来实现此目的,但没有成功

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

我的代码有问题吗?为什么

fillna()
可以识别
nan
,而
isnull()
却不能识别? 另外,为什么索引搜索将值显示为
nan
但当我尝试使用
replace()
替换相同的值时却没有结果?

当我的

fillna()
无法识别时,如何替换 nan 值?

python pandas dataframe nan fillna
3个回答
3
投票

本质上问题是

dfcomp['Functional'].mode()
的返回类型 这是一个单个元素
pandas.Series
,并且
fillna()
需要一个 标量或与您尝试填充的列具有相同长度的 dict/Series/DataFrame

您需要计算列的众数,然后将标量传递给

fillna()
方法。

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

1
投票

这是一个

Index
对齐问题。
pd.Series.mode
始终返回 Series,即使只返回一个值。因此,该系列的索引是
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

-1
投票

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

dfcomp = dfcomp.fillna(value=0)

稍后更新:

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

© www.soinside.com 2019 - 2024. All rights reserved.