Python 如何在数据帧中将单元格设置为NaN

Python 如何在数据帧中将单元格设置为NaN,python,pandas,nan,Python,Pandas,Nan,我想用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的副本。那么,正确的处理方法是什么?我见过许多使用iloc或ix的解决方案,但在这里,我需要使用布尔条件。只需使用替换即可

我想用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的副本。那么,正确的处理方法是什么?我见过许多使用iloc或ix的解决方案,但在这里,我需要使用布尔条件。

只需使用
替换即可:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN
您尝试的是所谓的链索引:

您可以使用
loc
确保在原始dF上操作:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN
您可以使用替换:

df['y'] = df['y'].replace({'N/A': np.nan})
还要注意
replace
inplace
参数。您可以执行以下操作:

df.replace({'N/A': np.nan}, inplace=True)
这将替换df中的所有实例,而不创建副本

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

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

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

参考资料:

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

Name: y, dtype: object
您真正需要的是使它成为一个数字列(它将具有适当的类型,并且速度会更快),所有非数字值都将替换为NaN

因此,好的转换代码是

pd.to_numeric(df['y'], errors='coerce')
Name: y, dtype: float64
指定
errors='concurve'
以强制无法解析为数值的字符串变为NaN。列类型将是

pd.to_numeric(df['y'], errors='coerce')
Name: y, dtype: float64

您可以尝试这些代码片段

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 在[16]中:mydata={'x':[10,50,18,32,47,20],'y':[12,11,N/A','13,15','N/A']} 在[17]中:df=pd.DataFrame(mydata) 在[18]中:df.y[df.y==“不适用”]=np.nan Out[19]:df xy 0 10 12 1 50 11 2 18南 3 32 13 4 47 15 520南
这就解决了你的问题。使用double[],您正在处理数据帧的副本。您必须在一次调用中指定确切位置才能修改它。

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

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

这里的大多数回复需要
将numpy导入为np

熊猫本身有一个内置的解决方案:
pd.NA
,可以这样使用:

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

我觉得这个标题有误导性。问题不在于您希望数据帧中包含NaN。问题是你“试图从一个数据帧中设置一个切片的副本”。虽然这不能解决OP的问题,但我投了更高的票,因为它实际上回答了标题中的问题。