Python 2.7 正在使用.isin()检查nan是否不工作
我有一个包含Python 2.7 正在使用.isin()检查nan是否不工作,python-2.7,pandas,Python 2.7,Pandas,我有一个包含NaN的熊猫数据帧 import pandas as pd df = pd.DataFrame([1,2,3,float('nan')], columns=['A']) df A 0 1 1 2 2 3 3 NaN 我还有一个列表filter\u list,我想用它来过滤我的数据帧。但是如果我使用.isin()函数,它不会检测NaN。我没有得到True而是在最后一行得到False filter_list = [1, float('nan')] df['A']
NaN
的熊猫数据帧
import pandas as pd
df = pd.DataFrame([1,2,3,float('nan')], columns=['A'])
df
A
0 1
1 2
2 3
3 NaN
我还有一个列表filter\u list
,我想用它来过滤我的数据帧。但是如果我使用.isin()
函数,它不会检测NaN
。我没有得到True
而是在最后一行得到False
filter_list = [1, float('nan')]
df['A'].isin(filter_list)
0 True
1 False
2 False
3 False
Name: A, dtype: bool
预期产出:
0 True
1 False
2 False
3 True
Name: A, dtype: bool
我知道我可以使用.isnull()
检查NaNs
。但这里我还有其他值要检查。我正在使用pandas0.16.0
version
编辑:列表
filter\u list
来自用户。所以它可能有也可能没有NaN
。这就是为什么我使用.isin()
浮点NaN有一个有趣的属性:
isin
检查是否相等。因此,不能使用isin
检查值是否等于NaN。
要检查NAN,最好使用np.isnull
如果您确实需要使用
isin()
来匹配NaN。您可以创建与nan具有相同哈希的类,并在与nan比较时返回True:
import numpy as np
import pandas as pd
class NAN(object):
def __eq__(self, v):
return np.isnan(v)
def __hash__(self):
return hash(np.nan)
nan = NAN()
df = pd.DataFrame([1,2,3,float('nan')], columns=['A'])
df.A.isin([1, nan])
您可以将
nan
替换为列表中不会出现的唯一非nan值,例如'NA'
或'
。例如:
In [23]: import pandas as pd
In [24]: df = pd.DataFrame([1, 2, 3, pd.np.nan], columns=['A'])
In [25]: filter_list = pd.Series([1, pd.np.nan])
In [26]: na_equiv = 'NA'
In [27]: df['A'].replace(pd.np.nan, na_equiv).isin(filter_list.replace(pd.np.nan, na_equiv))
Out[27]:
0 True
1 False
2 False
3 True
Name: A, dtype: bool
我认为最简单的方法是使用
numpy.nan
:
import pandas as pd
import numpy as np
df = pd.DataFrame([1, 2, 3, np.nan], columns=['A'])
filter_list = [1, np.nan]
df['A'].isin(filter_list)
这不起作用,因为
np
使用了NaN!=NaN
这就是失败的原因,因此您必须先过滤NaN
值,然后过滤其他值有一种方法,我可以在filter\u列表中创建NaN
元素,以便pandas理解它吗?不,我不这么认为,例如df['a'==float('NaN')
仍然不起作用,底线是您必须使用isnull
或notnull
来测试NaN
是否正确分析您的用户输入!不要让他们输入NaN!使用一些适当的NA值填充NA,并对用户输入执行相同的操作。问题是列表过滤器\u列表
来自用户。因此,它可能有也可能没有NaN
更改用户界面,使filter\u NaN
是一个附加参数,并且NaN不包括在filter\u list
中,或者选中pd.isnull(filter\u list)。any()
并相应地处理这些情况。更简单的方法是编写以下代码:将numpy作为np df=pd.DataFrame([1,2,3,np.nan],columns=['A'])导入
In [23]: import pandas as pd
In [24]: df = pd.DataFrame([1, 2, 3, pd.np.nan], columns=['A'])
In [25]: filter_list = pd.Series([1, pd.np.nan])
In [26]: na_equiv = 'NA'
In [27]: df['A'].replace(pd.np.nan, na_equiv).isin(filter_list.replace(pd.np.nan, na_equiv))
Out[27]:
0 True
1 False
2 False
3 True
Name: A, dtype: bool
import pandas as pd
import numpy as np
df = pd.DataFrame([1, 2, 3, np.nan], columns=['A'])
filter_list = [1, np.nan]
df['A'].isin(filter_list)