大熊猫检查nan使用.isin()

时间:2015-08-05 13:14:38

标签: python-2.7 pandas

我有以下pandas Dataframe,其中包含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_list,我想用它来过滤我的Dataframe。但是如果我使用.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版本

编辑:列表filter_list来自用户。所以它可能有也可能没有NaN。这就是为什么我使用.isin()

4 个答案:

答案 0 :(得分:4)

float NaN具有it is not equal to itself

的有趣属性
In [194]: float('nan') == float('nan')
Out[194]: False

isin检查是否相等。因此,您无法使用isin检查值是否等于 NaN。 要检查NaN,最好使用np.isnull

In [200]: df['A'].isin([1]) | df['A'].isnull()
Out[200]: 
0     True
1    False
2    False
3     True
Name: A, dtype: bool

答案 1 :(得分:4)

您可以将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

答案 2 :(得分:1)

如果您确实使用PARENTS_NEEDS来匹配NaN。您可以创建一个与nan具有相同哈希值的类,并在与nan进行比较时返回True:

isin()

答案 3 :(得分:1)

我认为最简单的方法是使用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)