Python - 即使它存在于Pandas Dataframe中,也不会识别Null值

时间:2017-12-13 06:06:55

标签: python python-3.x pandas

我正在阅读csv文件并从中创建一个Pandas Dataframe。它有许多不同数据类型的列。

假设“localHour”列仅包含数值,但不幸的是它包含“null”值,因为它可以在Microsoft Excel / Open Office应用程序中看到,甚至Pandas中的unique()方法也显示它包含“ null“values

df1['localHour'].unique()

Out[78]: 
array(['9', '12', '17', '16', '22', '19', '11', '15', '6', '18', '7', '21',
       '13', '20', '23', '10', '14', '8', '5', '3', '1', '0', '2', '4',
       'null', '-1'], dtype=object)

但令人惊讶的是isnull()方法在列中找不到任何空值。我无法理解这里有什么问题

df1['localHour'].isnull().values.any()
Out[80]: False

df1['localHour'].isnull().unique()    
Out[81]: array([False], dtype=bool)

4 个答案:

答案 0 :(得分:3)

这些不是数字,而是数字的字符串表示 并且Python不理解字符串'null'来表示NoneNaN或其他类似的空引用。原样,'null'只被视为包含字符n-u-l-l的字符串。

使用to_numeric()转换列,然后您会看到正确识别空值。

df1 = pd.DataFrame({"localHour":['9', '12', '17', '16', '22', '19', 
                                 '11', '15', '6', '18', '7', '21',
                                 '13', '20', '23', '10', '14', '8', 
                                 '5', '3', '1', '0', '2', '4', 'null', '-1']})
df1.localHour = pd.to_numeric(df1.localHour, errors="coerce")

df1.localHour.tail()
21    0.0
22    2.0
23    4.0
24    NaN
25   -1.0
Name: localHour, dtype: float64

df1.localHour.tail().isnull()
21    False
22    False
23    False
24     True
25    False
Name: localHour, dtype: bool

答案 1 :(得分:1)

  

pandas.isnull(OBJ)   检测缺失值(数值数组中的NaN,对象数组中的无/ NaN)

来源:https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.isnull.html

您的熊猫阵列属于string类型且包含

  • 非常短的字符串["9","12, ...])"
  • 一个较长的字符串[ ..., "null", ...]

None中的任何一个都不是myvalue = None

如果将它们转换为int并强制错误 - 字符串"null"将成为int数组中的NaN - 因为它不能转换为int。之后你可以用它来检测它isnull()。您还可以在panda数组中搜索"null" - 字符串,并将其替换为None,并按原样保留所有其他列。

之后None也可以检测到padans.isnull(.)

答案 2 :(得分:0)

在这里的几个人的帮助下,我发现Pandas的read_csv方法有一个参数“na_values”。如果我们传递值(我们认为应该被解释为NaN),那么数据帧中存在的那些值将被解释为“NaN”而不是字符串值。

例如在我的例子中,字符串“null”应该被解释为“NaN”。因此,如果我使用na_values参数创建一个Dataframe,那么我的Dataframe将不会有字符串“null”值。从命令输出中可以看出,所有这些值都被替换为NaN。

df1 = pd.read_csv("Train_Dataset.csv",na_values="null")

df1['localHour'].unique()
Out[97]: 
array([  9.,  12.,  17.,  16.,  22.,  19.,  11.,  15.,   6.,  18.,   7.,
        21.,  13.,  20.,  23.,  10.,  14.,   8.,   5.,   3.,   1.,   0.,
         2.,   4.,  nan,  -1.])

df1['localHour'].isnull().values.any()  
Out[98]: True

df1['localHour'].isnull().unique()
Out[99]: array([False,  True], dtype=bool)

附加说明:如果有人想在“na_values”参数中提及更多值,请将所有值作为列表提及

df1 = pd.read_csv("Train_Dataset.csv",na_values=["null","Null","nUlL"])

有用的参考链接 - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

答案 3 :(得分:0)

对于空格或表示为字符串的空值可以使用na_values中的空格

data1 = pd.read_csv(r"E:\intellipaat\r\customer_churn.csv",na_values=" ")