Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 正在使用.isin()检查nan是否不工作_Python 2.7_Pandas - Fatal编程技术网

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
。但这里我还有其他值要检查。我正在使用pandas
0.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)