gpt4 book ai didi

python - 为什么 "is not None"不能与 dataframe.loc 一起使用,但 "!= None"可以正常工作?

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:01 25 4
gpt4 key购买 nike

我目前正在玩 Pandas 数据框,我想选择数据框中没有 None 实体属性的所有数据条目。

df_ = df.loc[df['entities'] != None]

看起来效果不错但是

df_ = df.loc[df['entities'] is not None]

会引发 KeyError这是

File "pandas_libs\index.pyx", line 107, in >pandas._libs.index.IndexEngine.get_loc File "pandas_libs\index.pyx", line 128, in >pandas._libs.index.IndexEngine.get_loc File "pandas_libs\index_class_helper.pxi", line 91, in >pandas._libs.index.Int64Engine._check_type KeyError: True

好吧,我已经知道我原来问题的解决方案了,我只是好奇为什么会这样

最佳答案

代替

df_ = df.loc[df['entities'] is not None]

df_ = df.loc[df['entities'] != None]

你应该使用

df_ = df.loc[df['entities'].isna()]

因为pandas中缺失值的表示方式不同于python常用的None表示缺失值的方式。特别是你会得到关键错误,因为列系列 df['entities'] 是用 None 检查身份的。这在任何情况下都评估为 True,因为该系列不是 None。然后 .loc 在行索引中搜索 True,这在您的案例中不存在,因此会引发异常。 != 不会引发此异常,因为相等运算符已被 pandas.Series 重载(否则您无法通过将列与固定值,如 df['name'] == 'Miller')。此重载方法执行逐元素比较,并返回一个索引器,该索引器可与 .loc 方法一起正常工作。只是结果可能不是您想要的。

例如如果你这样做

import pandas as pd
import numpy as np
df= pd.DataFrame(dict(x=[1,2,3], y=list('abc'), nulls= [None, np.NaN, np.float32('inf')]))

df['nulls'].isna()

它返回:

Out[18]: 
0 True
1 True
2 False
Name: nulls, dtype: bool

但是代码:

df['nulls'] == None

返回

Out[20]: 
0 False
1 False
2 False
Name: nulls, dtype: bool

如果您查看列中存储的对象的数据类型,您会发现它们都是 float :

df['nulls'].map(type)
Out[19]:
0 <class 'float'>
1 <class 'float'>
2 <class 'float'>
Name: nulls, dtype: object

对于其他类型的列,缺失值的表示甚至可能不同。例如。如果您使用 Int64 列,它看起来像这样:

df['nulls_int64']= pd.Series([None, 1 , 2], dtype='Int64')
df['nulls_int64'].map(type)
Out[26]:
0 <class 'float'>
1 <class 'int'>
2 <class 'int'>
Name: nulls_int64, dtype: object

因此,使用 isna() 而不是 != None 还可以帮助您保持代码清洁,避免处理 pandas 内部数据表示。

关于python - 为什么 "is not None"不能与 dataframe.loc 一起使用,但 "!= None"可以正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57668496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com