如何在 pandas 数据框中将单元格设置为 NaN
How to set a cell to NaN in a pandas dataframe
我想用 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 的解决方案,但在这里,我需要使用布尔条件。
只需使用 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
您可以使用替换:
df['y'] = df['y'].replace({'N/A': np.nan})
还要注意 replace
的 inplace
参数。你可以这样做:
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})
虽然使用 replace
似乎可以解决问题,但我想提出一个替代方案。列中混合数字和某些字符串值的问题不是用 np.nan 替换字符串,而是使整个列正确。我敢打赌,原始列很可能是对象类型
Name: y, dtype: object
您真正需要的是使其成为一个数字列(它将具有正确的类型并且会更快),所有 non-numeric 值都替换为 NaN。
因此,好的转换代码应该是
pd.to_numeric(df['y'], errors='coerce')
指定errors='coerce'
强制将无法解析为数值的字符串变为NaN。列类型为
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
df.loc[df.y == 'N/A',['y']] = np.nan
这解决了你的问题。使用双 [],您正在处理 DataFrame 的副本。您必须在一次调用中指定确切位置才能修改它。
从 pandas 1.0.0 开始,您不再需要使用 numpy 在数据框中创建空值。相反,您可以只使用 pandas.NA(属于 pandas._libs.missing.NAType 类型),因此它将在数据帧内被视为 null,但在数据帧上下文之外不会为 null。
df.replace('columnvalue',np.NaN,inplace=True)
以上大部分回复都需要导入外部模块:
import numpy as np
pandas 本身有一个内置解决方案:pd.NA
,可以这样使用:
df.replace('N/A', pd.NA)
我想用 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 的解决方案,但在这里,我需要使用布尔条件。
只需使用 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
您可以使用替换:
df['y'] = df['y'].replace({'N/A': np.nan})
还要注意 replace
的 inplace
参数。你可以这样做:
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})
虽然使用 replace
似乎可以解决问题,但我想提出一个替代方案。列中混合数字和某些字符串值的问题不是用 np.nan 替换字符串,而是使整个列正确。我敢打赌,原始列很可能是对象类型
Name: y, dtype: object
您真正需要的是使其成为一个数字列(它将具有正确的类型并且会更快),所有 non-numeric 值都替换为 NaN。
因此,好的转换代码应该是
pd.to_numeric(df['y'], errors='coerce')
指定errors='coerce'
强制将无法解析为数值的字符串变为NaN。列类型为
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
df.loc[df.y == 'N/A',['y']] = np.nan
这解决了你的问题。使用双 [],您正在处理 DataFrame 的副本。您必须在一次调用中指定确切位置才能修改它。
从 pandas 1.0.0 开始,您不再需要使用 numpy 在数据框中创建空值。相反,您可以只使用 pandas.NA(属于 pandas._libs.missing.NAType 类型),因此它将在数据帧内被视为 null,但在数据帧上下文之外不会为 null。
df.replace('columnvalue',np.NaN,inplace=True)
以上大部分回复都需要导入外部模块:
import numpy as np
pandas 本身有一个内置解决方案:pd.NA
,可以这样使用:
df.replace('N/A', pd.NA)