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

Mar*_*son 76 python nan pandas

我想用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
Run Code Online (Sandbox Code Playgroud)

虽然,最后一行失败并抛出警告,因为它正在处理df的副本.那么,处理这个问题的正确方法是什么?我已经看过许多使用iloc或ix的解决方案但是在这里,我需要使用布尔条件.

EdC*_*ica 97

只需使用replace:

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
Run Code Online (Sandbox Code Playgroud)

您正在尝试的是链索引:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 你可以做`df ['y'].替换('N/A','y')`用于特定的col (5认同)
  • 它与大熊猫无关,numpy nan值本身就是这样设计的 (3认同)
  • 使用此解决方案,您还必须将 numpy 导入为 np. 通过使用 pd.NA 无需导入 numpy。 (2认同)

Sev*_*eux 10

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

Name: y, dtype: object
Run Code Online (Sandbox Code Playgroud)

你真正需要的是使它成为一个数字列(它将具有正确的类型并且会更快),所有非数字值都被NaN取代.

因此,良好的转换代码将是

pd.to_numeric(df['y'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)

指定errors='coerce'强制无法解析为数值的字符串变为NaN.列类型将是

Name: y, dtype: float64
Run Code Online (Sandbox Code Playgroud)


小智 8

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


jmo*_*son 5

您可以使用replace:

df['y'] = df['y'].replace({'N/A': np.nan})
Run Code Online (Sandbox Code Playgroud)

另请注意的inplace参数replace。您可以执行以下操作:

df.replace({'N/A': np.nan}, inplace=True)
Run Code Online (Sandbox Code Playgroud)

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

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

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

df['y'] = df['y'].replace({None: np.nan})
Run Code Online (Sandbox Code Playgroud)

参考:熊猫最新-替换


sta*_*One 5

这里的大多数回复需要 import numpy as np

pandas 本身有一个内置的解决方案:pd.NA,像这样使用:

df.replace('N/A', pd.NA)
Run Code Online (Sandbox Code Playgroud)