使用isnull 比较NaN:
df = pd.DataFrame({'ods': {0: 'A86016', 1: 'L81042', 2: 'C84013', 3: 'G82228', 4: 'C81083'},
'id': {0: np.nan, 1: 463061.0, 2: np.nan, 3: 462941.0, 4: np.nan},
'provider': {0: 'emis', 1: np.nan, 2: 'tpp', 3: 'emis', 4: 'tpp'}})
print df
id ods provider
0 NaN A86016 emis
1 463061.0 L81042 NaN
2 NaN C84013 tpp
3 462941.0 G82228 emis
4 NaN C81083 tpp
print (df[df.provider.isnull()])
ods id provider
1 L81042 463061.0 NaN
print len(df[df.provider.isnull()])
1
如果您需要将NaN 转换为`` 使用fillna:
df.provider.fillna('', inplace=True)
print df
id ods provider
0 NaN A86016 emis
1 463061.0 L81042
2 NaN C84013 tpp
3 462941.0 G82228 emis
4 NaN C81083 tpp
Docs:
警告
必须注意,在 python(和 numpy)中,nan 的比较不相等,但 None 的比较。请注意,Pandas/numpy 使用 np.nan != np.nan 这一事实,并将 None 视为 np.nan。
In [11]: None == None
Out[11]: True
In [12]: np.nan == np.nan
Out[12]: False
因此,与上面相比,标量相等比较与 None/np.nan 不提供有用的信息。
In [13]: df2['one'] == np.nan
Out[13]:
a False
b False
c False
d False
e False
f False
g False
h False
Name: one, dtype: bool
但如果nan 是字符串:
df = pd.DataFrame({'ods': {0: 'A86016', 1: 'L81042', 2: 'C84013', 3: 'G82228', 4: 'C81083'},
'id': {0: np.nan, 1: 463061.0, 2: np.nan, 3: 462941.0, 4: np.nan},
'provider': {0: 'emis', 1: 'nan', 2: 'tpp', 3: 'emis', 4: 'tpp'}})
print df
ods id provider
0 A86016 NaN emis
1 L81042 463061.0 nan
2 C84013 NaN tpp
3 G82228 462941.0 emis
4 C81083 NaN tpp
print (df[df.provider == 'nan'])
ods id provider
1 L81042 463061.0 nan
你知道为什么 pandas 将空字符串导入为 NaN 而不是空字符串吗?
见docs(我加粗):
na_values : str, list-like 或 dict,默认 None
识别为 NA/NaN 的附加字符串。如果 dict 通过,特定的每列 NA 值。默认情况下,以下值被解释为 NaN:'-1.#IND'、'1.#QNAN'、'1.#IND'、'-1.#QNAN'、'#N/AN/A'、' #N/A'、'N/A'、'NA'、'#NA'、'NULL'、'NaN'、'-NaN'、'nan'、'-nan'、''强>。