我有以下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()
答案 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)