fillna 不替换数据框中的 nan 值

Posted

技术标签:

【中文标题】fillna 不替换数据框中的 nan 值【英文标题】:fillna not replacing nan values in the dataframe 【发布时间】:2020-02-26 02:46:20 【问题描述】:

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

    我可以使用isnull() 检测空值

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

search for null values

    使用上面的索引我搜索了实际值

dfcomp['Functional'][2216]

value search using the index

    但是当我尝试使用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()

    我也尝试过使用 replace() 函数,但没有成功

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

我的代码有问题吗?为什么fillna() 无法识别nanisnull() 可以识别? 另外,为什么索引搜索显示值为nan,但是当我尝试使用replace() 替换相同的值时没有结果?

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

【问题讨论】:

嗨 PVL,欢迎来到 SO。对于可以将输出复制并粘贴到格式化代码块中的编码问题,通常不鼓励使用图像。您可以查看***.com/questions/20109391/…,了解如何让您的数据更容易获得/重现。 【参考方案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)

【讨论】:

好的,让我试试……但是对于具有浮点值的列,我能够以相同的方式分配模式。 --> ` for col in columns: if dfcomp[col].isnull().sum()dfcomp[col]=dfcomp[col].fillna(value=dfcomp[col].mode() ) print(col," " ,dfcomp[col].isnull().sum()) else: print(col, ' ', 'Missing') dfcomp[col].fillna(value='Missing' ,inplace=True)` 如果没有实际看到数据和实现就很难判断,但它看起来很奇怪,除非浮点列的模式数据帧恰好与原始 df 具有相同的行数【参考方案2】:

这是一个Index 对齐问题。 pd.Series.mode 总是返回 Series,即使只返回一个值。因此,该系列的索引是 RangeIndex(最多与模式相关的值的数量),因此当您使用 .fillna 时,它会尝试在 Index 上对齐,而这通常与您的 DataFrame 不对齐。

你想选择模态 value 所以使用.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

【讨论】:

【参考方案3】:

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

dfcomp = dfcomp.fillna(value=0)

后期更新:

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

【讨论】:

他想用列的模式而不是 0 来填充。另外,看起来他试图只填充一列而不是整个数据框

以上是关于fillna 不替换数据框中的 nan 值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 替换 NaN 值

替换数据框中的 NaN 索引值

如何将数据框列转换为字符串并替换 nans(fillna 不起作用)

pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan使用pandas的fillna函数用经验固定值填充缺失值np.nan

将给定 .csv 文件中的现有值替换为 NAN

为啥在数据帧上具有中位数的 fillna 仍然在熊猫中留下 Na/NaN?