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()
无法识别nan
而isnull()
可以识别?
另外,为什么索引搜索显示值为nan
,但是当我尝试使用replace()
替换相同的值时没有结果?
当我的fillna()
无法识别时,如何替换 nan 值?
【问题讨论】:
嗨 PVL,欢迎来到 SO。对于可以将输出复制并粘贴到格式化代码块中的编码问题,通常不鼓励使用图像。您可以查看***.com/questions/20109391/…,了解如何让您的数据更容易获得/重现。 【参考方案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)
【讨论】:
好的,让我试试……但是对于具有浮点值的列,我能够以相同的方式分配模式。 --> ` 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 值的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据框列转换为字符串并替换 nans(fillna 不起作用)
pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan使用pandas的fillna函数用经验固定值填充缺失值np.nan