熊猫使用.isin()检查nan无法正常工作

Kat*_*mar 3 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
Run Code Online (Sandbox Code Playgroud)

我还有filter_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
Run Code Online (Sandbox Code Playgroud)

预期产量:

0     True
1    False
2    False
3    True
Name: A, dtype: bool
Run Code Online (Sandbox Code Playgroud)

我知道我可以.isnull()用来检查NaNs。但是在这里,我还需要检查其他值。我正在使用熊猫0.16.0

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

unu*_*tbu 6

浮点NaN具有有趣的性质,即它不等于自身

In [194]: float('nan') == float('nan')
Out[194]: False
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 要么更改用户界面,以使filter_nan是一个附加参数,并且在filter_list中不包含NaN,否则请检查pd.isnull(filter_list).any()并相应地处理这些情况。 (2认同)

S A*_*and 5

您可以替换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
Run Code Online (Sandbox Code Playgroud)