当前位置:   article > 正文

python之pandas中NaN与None的比较与处理_pandas nan

pandas nan

目录

(1)NaN与None比较

1.None 和 NaN 的区别

2.None 和 NaN创建示例

3.None 类型和数值类型运算会报错

4.判断是否为NaN或者None

用np.isnan()

用np.isnull()

(2)dataframe空值处理

1.将NaN变为指定值:df.fillna(value)

将空值变为指定值

前向填充和后向填充

使用fillna方法将NaN转换为零

使用replace方法将NaN转换为零

2.将None变为指定值

3.删除空值NaN:df.dropna()

4.是否为空值NaN或者None:df.isnull()

5.df.empty判断df是否存在数据

6.将类型为float的NaN变为int类型


(1)NaN与None比较

1.None 和 NaN 的区别

NaN是一个特殊的浮点数值,它表示缺失数据或不可用数据。在Pandas中,NaN表示一个缺失或无效的值,它是一个Python float对象。当我们在DataFrame中找到NaN时,我们通常希望使用其他值(如0)替换它,以便继续进行数据操作。

  • None 表示信息缺失,但其类型不是数字。 因此,任何包含 None 值的列(比如 Pandas Series)肯定不是数字类型,例如 int 或 float。
  • NaN 也表示数据缺失,是数字类型。 这意味着可以在 int 或 float 类型的数值列中找到 NaN。

2.None 和 NaN创建示例

a.用np.nan生成空缺数值

  1. import numpy as np
  2. import pandas as pd
  3. x = pd.Series([1, np.nan])
  4. print(x)
  5. print(x[1])
  6. print(type(x[1]))
'
运行

运行结果

  1. 0 1.0
  2. 1 NaN
  3. dtype: float64
  4. nan
  5. <class 'numpy.float64'>

b.创建None

在下面的代码中,创建了None值。

  1. import pandas as pd
  2. x = pd.Series(["1", None])
  3. print(x)
  4. print(x[1])
  5. print(type(x[1]))
'
运行

运行结果

  1. 0 1
  2. 1 None
  3. dtype: object
  4. None
  5. <class 'NoneType'>

c.None自动转换为 NaN 值

在下面的测试中,None 值会自动转换为 NaN 值,因为该list中的其他数值是数字, Pandas 自动将 None 转换为 NaN。NaN类型对于很多算术操作来更简单,因此被优先考虑。

  1. import pandas as pd
  2. x = pd.Series([1, None])
  3. print(x)
  4. print(x[1])
  5. print(type(x[1]))
'
运行

运行结果

  1. 0 1.0
  2. 1 NaN
  3. dtype: float64
  4. nan
  5. <class 'numpy.float64'>

3.None 类型和数值类型运算会报错

为什么我们说,使用 NaN 类型对于许多常用操作会更有利?

因为NaN对许多算术运算来说是合法的。 例如,下面涉及None的操作会报错:

None + 1

运行报错

  1. ---------------------------------------------------------------------------
  2. TypeError Traceback (most recent call last)
  3. <ipython-input-8-3fd8740bf8ab> in <module>
  4. ----> 1 None + 1
  5. TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

但如果是NaN类型,就不会报错。

  1. import numpy as np
  2. x = np.nan + 1
  3. print(x) # nan
  4. print(x == np.nan) # false
  5. # 因为不能直接判断是否为nan,需要用相应函数
'
运行

4.判断是否为NaN或者None

用np.isnan()

首先可以使用 numpy,函数 np.isnan() 可以检查一个值是否为 NaN 值,但它不适用于 None 值。

  1. import numpy as np
  2. ret = np.isnan(np.nan)
  3. print(ret) # True
  4. # ret = np.isnan(None)
  5. # TypeError: ufunc 'isnan' not supported for the input types
'
运行

用np.isnull()

另一方法, isnull() 可以用来检测缺失值, nan 或 None 都将为 True。

  1. print(np.isnan(np.nan)) # True
  2. print(pd.isnull(None)) # True

如果isnull()返回真,且isnan出现TypeError,说明是None类型。

(2)dataframe空值处理

1.将NaN变为指定值:df.fillna(value)

将空值变为指定值

  1. import pandas as pd
  2. import numpy as np
  3. data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
  4. 'Qu2': [2, 3, 1, 2, 3],
  5. 'Qu3': [1, 5, 2, np.nan, np.nan]},
  6. index = list('abcde'))
  7. print(data)
  8. # Qu1 Qu2 Qu3
  9. # a NaN 2 1.0
  10. # b 3.0 3 5.0
  11. # c 4.0 1 2.0
  12. # d 3.0 2 NaN
  13. # e 4.0 3 NaN
  14. data.fillna(999, inplace = True)
  15. print(data)
'
运行

前向填充和后向填充

DataFrame填充缺失值可以统一填充,也可以前向和后向填充:前向填充就是将空值填充为它上一个索引对应的值,如果是多个空值相连,则将这多个相连的空值填充为它们上面不为空值的那个值。

  1. data.fillna(method='ffill', inplace = True)
  2. print(data)
  3. # Qu1 Qu2 Qu3
  4. # a NaN 2 1.0
  5. # b 3.0 3 5.0
  6. # c 4.0 1 2.0
  7. # d 3.0 2 2.0
  8. # e 4.0 3 4.0
  9. data.fillna(method='bfill', inplace = True)
  10. print(data)

使用fillna方法将NaN转换为零

Pandas中的fillna方法可用于将NaN替换为指定的值。我们可以使用该方法将DataFrame中的NaN替换为零。以下是使用该方法的示例代码:

  1. import pandas as pd
  2. data = {'A': [1, 2, np.nan, 4],
  3. 'B': [5, np.nan, 7, 8],
  4. 'C': [9, 10, 11, np.nan]}
  5. df = pd.DataFrame(data)
  6. print(df)
  7. df_filled = df.fillna(0)
  8. print(df_filled)

输出:

  1. A B C
  2. 0 1.0 5.0 9.0
  3. 1 2.0 NaN 10.0
  4. 2 NaN 7.0 11.0
  5. 3 4.0 8.0 NaN
  6. A B C
  7. 0 1.0 5.0 9.0
  8. 1 2.0 0.0 10.0
  9. 2 0.0 7.0 11.0
  10. 3 4.0 8.0 0.0

如上所示,NaN值已被成功地替换为零

使用replace方法将NaN转换为零

除了使用fillna方法之外,我们还可以使用replace方法将NaN转换为零。

与fillna方法不同的是,replace方法还可以用于替换其他指定的值,而不仅仅是NaN。

以下是使用replace方法的示例代码:

  1. import pandas as pd
  2. import numpy as np
  3. data = {'A': [1, 2, np.nan, 4],
  4. 'B': [5, np.nan, 7, 8],
  5. 'C': [9, 10, 11, np.nan]}
  6. df = pd.DataFrame(data)
  7. print(df)
  8. df_filled = df.replace(np.nan, 0)
  9. print(df_filled)
'
运行

输出

  1. A B C
  2. 0 1.0 5.0 9.0
  3. 1 2.0 NaN 10.0
  4. 2 NaN 7.0 11.0
  5. 3 4.0 8.0 NaN
  6. A B C
  7. 0 1.0 5.0 9.0
  8. 1 2.0 0.0 10.0
  9. 2 0.0 7.0 11.0
  10. 3 4.0 8.0 0.0

2.将None变为指定值

  1. import pandas as pd
  2. df2 = pd.DataFrame(data=[[None, "x"], ["y", None],
  3. ["hello world"]],
  4. columns=["A", "B"])
  5. print(df2)
  6. '''
  7. A B
  8. 0 None x
  9. 1 y None
  10. 2 hello world None
  11. '''
  12. print(df2["A"][0]) # None
  13. print(type(df2["A"][0])) # <class 'NoneType'>
  14. # 将为None的值变为"==="
  15. ret = df2.applymap(lambda x: "===" if x is None else x)
  16. print(ret)
  17. '''
  18. A B
  19. 0 === x
  20. 1 y ===
  21. 2 hello world ===
  22. '''
'
运行

3.删除空值NaN:df.dropna()

  1. data = pd.DataFrame([[1,6.5,3],
  2. [1,np.nan,np.nan],
  3. [np.nan,np.nan,np.nan],
  4. [np.nan,6.5,3]
  5. ])
  6. data.dropna()
  7. #输出
  8. # 0 1 2
  9. #0 1.0 6.5 3.0

对DataFrame来说,dropna方法如果发现缺失值,就会进行整行删除

不过可以指定删除的方式,how=all,是当整行全是nan的时候才进行删除,同时还可以按指定的轴删除。

  1. data.dropna(how='all',axis=1,inplace=True)
  2. data
  3. #输出
  4. # 0 1 2
  5. #0 1.0 6.5 3.0
  6. #1 1.0 NaN NaN
  7. #2 NaN NaN NaN
  8. #3 NaN 6.5 3.0

还可以限制为指定的某些列存在空值时才删除整行数据

  1. # 指定一些列中若含有空值,则去掉对应的行
  2. all_column = ["name", "date", "time", "quantity"]
  3. subset = all_column[1:-1]
  4. df_trade.dropna(subset=subset, how='any', inplace=True)

剔除掉df类型数据某列数据中为空所在的行

data=data[pd.isnull(data['column_name'])==False]

4.是否为空值NaN或者None:df.isnull()

  1. import pandas as pd
  2. import numpy as np
  3. data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
  4. 'Qu2': [2, 3, 1, 2, 3],
  5. 'Qu3': [1, 5, 2, 4, np.nan]},
  6. index = list('abcde'))
  7. print(data)
  8. # Qu1 Qu2 Qu3
  9. # a NaN 2 1.0
  10. # b 3.0 3 5.0
  11. # c 4.0 1 2.0
  12. # d 3.0 2 4.0
  13. # e 4.0 3 NaN
  14. result = data.isnull()
  15. print(result)
  16. # Qu1 Qu2 Qu3
  17. # a True False False
  18. # b False False False
  19. # c False False False
  20. # d False False False
  21. # e False False True
'
运行

判断df某一项的值是否为空

判断DataFrame中某一项的值是否为空的方法有两种:

1.通过pd.isnull()来判断,语法格式:

nan 或 None 都将为 True

  1. import pandas as pd
  2. pd.isnull(data.loc[i,'column_name'])
  3. pd.isnull(data.loc[i,'column_name'])==True
  4. if not pd.isnull(data.loc[i,'column_name']):
  5. pass

2.通过np.nan 来比较判断,语法格式:

nan将为 True

df['column_name'][i] is not np.nan

5.df.empty判断df是否存在数据

如果这个 DataFrame 只有列名,但是没有实际数据,会被 DataFrame.empty 判定为空

如果这个 DataFrame 仅由 缺失值 (NaN) 构成,不会被 DataFrame.empty 判定为空

  1. import numpy as np
  2. import pandas as pd
  3. df1 = pd.DataFrame(data=None)
  4. print(df1.empty) # True
  5. df2 = pd.DataFrame(data=[np.nan, np.nan])
  6. print(df2)
  7. '''
  8. 0
  9. 0 NaN
  10. 1 NaN
  11. '''
  12. print(df2.empty) # False
  13. df3 = pd.DataFrame(data=[np.nan, 2])
  14. print(df3.empty) # False
'
运行

6.将类型为float的NaN变为int类型

一个简单例子

df['A'] = df['A'].astype(int)

再一个例子,像在format函数中,用"06d"这类参数将整数类型格式化为指定格式的字符串时,元素只能是整数类型,当数据存在空值时会被加载为NaN值,如果其属于浮点数类型,则对NaN调用format函数时会报错

ValueError: Unknown format code 'd' for object of type 'float'

因此需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型

  1. all_column = ["name", "date", "time", "quantity"]
  2. # 指定一些列中若含有空值,则去掉对应的行
  3. subset = all_column[1:-1]
  4. df_trade.dropna(subset=subset, how='any', inplace=True)
  5. # 浮点数类型转化为整数类型
  6. for col in subset:
  7. df_trade[col] = df_trade[col].astype(int)

注意NaN为float类型时,.astype(int)转换,会发生错误

ValueError: cannot convert float NaN to integer

一个常见的替换值是0。您可以使用fillna()方法将所有NaNs替换为0,然后使用.astype(int)将该列转换为int类型。以下是一个示例代码:

df['A'] = df['A'].fillna(0).astype(int)

end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/931808
推荐阅读
相关标签
  

闽ICP备14008679号