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

Posted

技术标签:

【中文标题】如何在熊猫数据框中将单元格设置为 NaN【英文标题】:How to set a cell to NaN in a pandas dataframe 【发布时间】:2016-04-20 01:02:30 【问题描述】:

我想用 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 在您的数据框中。问题是您“试图在数据帧的切片副本上设置”。 【参考方案1】:

只需使用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

您正在尝试的称为链索引: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

【讨论】:

【参考方案2】:

上面的大多数回复都需要导入外部模块: import numpy as np

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

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

【讨论】:

【参考方案3】:

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

Name: y, dtype: object

您真正需要的是使其成为数字列(它将具有正确的类型并且会更快),所有非数字值都替换为 NaN。

因此,好的转换代码应该是

pd.to_numeric(df['y'], errors='coerce')

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

Name: y, dtype: float64

【讨论】:

【参考方案4】:

你可以使用替换:

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

还要注意replaceinplace 参数。您可以执行以下操作:

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

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

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

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

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

参考:Pandas Latest - Replace

【讨论】:

【参考方案5】:

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

【讨论】:

虽然这并不能解决 OP 的问题,但我投了赞成票,因为它实际上回答了标题中的问题。【参考方案6】:
df.loc[df.y == 'N/A',['y']] = np.nan

这解决了你的问题。使用双 [],您正在处理 DataFrame 的副本。您必须在一次调用中指定确切位置才能对其进行修改。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

你可以试试这些sn-ps。

在 [16]:mydata = 'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', ' 15','不适用'] 在 [17] 中:df=pd.DataFrame(mydata) 在[18]中:df.y[df.y=="N/A"]=np.nan 输出[19]:df xy 0 10 12 1 50 11 2 18 南 3 32 13 4 47 15 5 20 南

【讨论】:

以上是关于如何在熊猫数据框中将单元格设置为 NaN的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框中的分割行

如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

如何遍历熊猫数据框中的每一列和每个单元格

如何将熊猫数据框的多行标题合并到单个单元格标题中?

过滤单元格中有数组的熊猫数据框

如何在熊猫中合并两个数据框以替换 nan