如何在pandas数据框中将单元格设置为NaN

172

我想用NaN替换数据框中某一列中的错误数值。

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

尽管最后一行失败并抛出警告,因为它在df的副本上工作。那么,正确的处理方式是什么?我看到许多解决方案使用ilocix,但在这里我需要使用布尔条件。


我觉得标题有误导性。问题不在于你想要在数据框中使用NaN,而在于你“试图在DataFrame的切片副本上进行设置”。 - Teepeemm
10个回答

193

2
使用这个解决方案,您还需要导入numpy作为np。但是使用pd.NA就不需要导入numpy了。 - Armando Contestabile

48

在这里大多数回复都需要导入一个外部模块:

import numpy as np

事实上,pandas本身就有内置的解决方案: pd.NA,可以像这样使用:

df.replace('N/A', pd.NA)

https://dev59.com/4lIH5IYBdhLWcg3wUcMm - Jérôme

18

虽然使用replace似乎可以解决问题,但我想提出一种替代方案。在列中混合数字和某些字符串值的问题不是将字符串替换为np.nan,而是使整个列正确。我打赌原始列很可能是对象类型

Name: y, dtype: object
你真正需要的是将它变成数字列(它将拥有正确的类型并且速度会更快),所有非数字值都应替换为 NaN。
因此,良好的转换代码应如下:
pd.to_numeric(df['y'], errors='coerce')

使用errors='coerce'来强制将无法解析为数字的字符串转换为 NaN。列类型将会变为

Name: y, dtype: float64

13

从pandas 1.0.0开始,您不再需要使用numpy在数据框中创建空值。相反,您可以使用pandas.NA(类型为pandas._libs.missing.NAType),因此它将在数据框内被视为null但在数据框外上下文中不会为空。


虽然这并没有解决 OP 的问题,但我还是点了赞,因为它实际上回答了标题中的问题。 - Teepeemm

12

您可以使用 replace:

df['y'] = df['y'].replace({'N/A': np.nan})

还要注意 replaceinplace 参数。你可以这样做:

df.replace({'N/A': np.nan}, inplace=True)

这将替换df中的所有实例而不创建副本。

类似地,如果你遇到其他类型的未知值,如空字符串或None值:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

参考: Pandas最新版本-替换


1
df.loc[df.y == 'N/A',['y']] = np.nan

这可以解决你的问题。使用双重[],你正在处理DataFrame的副本。你必须在一个调用中指定确切的位置才能修改它。

1

您可以使用wheremask

df = df.where(df != 'N/A')

或者

df = df.mask(df == 'N/A')

1

要直接替换 DataFrame 中的值,请使用 inplace 参数。

df.replace('columnvalue', np.NaN, inplace=True)

0

您可以尝试这些代码片段。

In [16]:mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
In [17]:df=pd.DataFrame(mydata)
In [18]:df.y[df.y=="N/A"]=np.nan
Out[19]:df x y 0 10 12 1 50 11 2 18 NaN 3 32 13 4 47 15 5 20 NaN

-1
你可以使用Pandas提供的fillna方法。
df.fillna(0,inplace=True) 

第一个参数是您想用来替换NA的任何值。

默认情况下,Pandas fillna方法返回一个新的数据帧。(这是默认行为,因为默认情况下,inplace参数设置为inplace = False。)

如果将inplace = True设置为True,则该方法将不返回任何内容,并且将直接修改正在操作的数据帧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接