Python Pandas hasnans为包含NaN值的列返回错误的值
我有一个数据框,大约有200列,7000行。列<代码> b>代码>完全由代码<楠>代码>值组成,中间除外400行。 总而言之,B列如下所示(为简洁起见进行了压缩): 但是,当我编写如下代码时,Python Pandas hasnans为包含NaN值的列返回错误的值,python,python-3.x,pandas,dataframe,nan,Python,Python 3.x,Pandas,Dataframe,Nan,我有一个数据框,大约有200列,7000行。列 b>代码>完全由代码代码>值组成,中间除外400行。 总而言之,B列如下所示(为简洁起见进行了压缩): 但是,当我编写如下代码时,hasnans属性的值似乎不正确。我是否错误地使用了该属性 df['B'].hasnans 返回 False 编辑: 下面是我正在导入熊猫的CSV文件的一个小示例。该列仍然无法找到NaN值。精明的观察者会注意到列标题中B周围的空格。这是意料之中的事,而不是问题所在 " DATE TIME "," A
hasnans
属性的值似乎不正确。我是否错误地使用了该属性
df['B'].hasnans
返回
False
编辑:
下面是我正在导入熊猫的CSV文件的一个小示例。该列仍然无法找到NaN值。精明的观察者会注意到列标题中B
周围的空格。这是意料之中的事,而不是问题所在
" DATE TIME "," A "," C "," B "
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:45:07, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
在我看来,它显示为false是因为您列中的
“NaN”
值是“NaN”
而不是np.NaN
,因此我猜该列的数据类型可能是“object”。因此,您必须将该“NaN”
值转换为np.NaN
,以便列的对象可以是int或float,并且hasnans将返回正确的布尔值。所以首先,
df[df["B"] == "NaN"] = np.nan #it will convert "NaN" values into np.nan
现在,您可以使用hasnans
或isnull()检查NaN值。any()
干杯 在我看来,它显示为false,因为您列中的值是
“NaN”
而不是np.NaN
,因此我猜该列的数据类型可能是“object”。因此,您必须将该“NaN”
值转换为np.NaN
,以便列的对象可以是int或float,并且hasnans将返回正确的布尔值。所以首先,
df[df["B"] == "NaN"] = np.nan #it will convert "NaN" values into np.nan
现在,您可以使用hasnans
或isnull()检查NaN值。any()
干杯 考虑
" DATE TIME "," A "," C "," B "
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:45:07, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
作为作为数据帧导入的.csv文件,您必须注意要查找的实际值
事实上:
import pandas as pd
import numpy as np
df = pd.read_csv('filename.csv', header=0)
df[' B '].replace(' NaN', np.nan, inplace=True)
df[' B '].hasnans
返回:
True
考虑到
" DATE TIME "," A "," C "," B "
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:44:36, 5448, 0.00, NaN
12/11/2018 15:45:07, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:08, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
12/11/2018 15:45:09, 5448, 0.00, NaN
作为作为数据帧导入的.csv文件,您必须注意要查找的实际值
事实上:
import pandas as pd
import numpy as np
df = pd.read_csv('filename.csv', header=0)
df[' B '].replace(' NaN', np.nan, inplace=True)
df[' B '].hasnans
返回:
True
在中读取csv时,应使用
skipinitialspace
选项删除数据中的前导空格。请注意,由于列名在引号中,因此这些列名周围的空白将保留
#伪造csv
从io导入StringIO
mock_csv=StringIO()
模拟csv.write(“”)\
“日期时间”、“A”、“C”、“B”
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:45:075448,0.00,南
2018年11月12日15:45:085448,0.00,南
2018年11月12日15:45:085448,0.00,南
2018年11月12日15:45:095448,0.00,南
2018年11月12日15:45:095448,0.00,南
""")
模拟csv.seek(0)
#忽略初始空白
df=pd.read\u csv(mock\u csv,skipinitialspace=True)
断言df['B'].hasnans
查看文档在中读取csv时,应使用
skipinitialspace
选项删除数据中的前导空格。请注意,由于列名在引号中,因此这些列名周围的空白将保留
#伪造csv
从io导入StringIO
mock_csv=StringIO()
模拟csv.write(“”)\
“日期时间”、“A”、“C”、“B”
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:44:365448,0.00,南
2018年11月12日15:45:075448,0.00,南
2018年11月12日15:45:085448,0.00,南
2018年11月12日15:45:085448,0.00,南
2018年11月12日15:45:095448,0.00,南
2018年11月12日15:45:095448,0.00,南
""")
模拟csv.seek(0)
#忽略初始空白
df=pd.read\u csv(mock\u csv,skipinitialspace=True)
断言df['B'].hasnans
查看文档我复制并粘贴了您的确切df和代码,并返回True。在您的实例中,它们可能是NaN的字符串。将数据类型更改为int并重试。我想您的意思是将数据类型更改为
float
是的,我已将数据类型更改为float
并重试,谢谢。我复制并粘贴了您的确切df和代码,并返回True。在您的实例中,它们可能是NaN的字符串。将数据类型更改为int并重试。我想您的意思是将数据类型更改为float
是的,我做了,将数据类型更改为float
并重试,谢谢您您的答案给出了最简洁的修复,因此您得到了选中标记。您的答案给出了最简洁的修复,因此您得到了选中标记。您的解决方案运行良好,除非有不同数量的空格。我将它推广到一个正则表达式\sNaN
,并设置了正则表达式标志,它按预期工作。您的解决方案工作得很好,除了在具有不同空格数的情况下。我将它概括为一个正则表达式\sNaN
,并设置了正则表达式标志,它按预期工作。