2020.12补充:目前 np.nan
和''
不再相等,举栗子:
import pandas as pd
import numpy as np
df = pd.DataFrame({'tem': ['a', 'b', 'c', ''],
'tem1': ['a', np.nan, '', 'd'],
'tem2': ['a', 'b', 'c', 'd']})
df['new'] = df['tem'] + df['tem1'] + df['tem2']
print(df)
# 结果如下
tem tem1 tem2 new
0 a a a aaa
1 b NaN b NaN # 注意:列new这里直接是NaN
2 c c cc
3 d d dd
print(df[df['tem1'].isna()])
# 结果如下
tem tem1 tem2 new
1 b NaN b NaN # 注意:结果仅有 NaN的
print(df[df['tem1']==''])
# 结果如下
tem tem1 tem2 new
2 c c cc # 注意:结果无 NaN的
附注:线下csv文件,空格在DataFrame里边也是用的“NaN”表示。
Pandas isna()
vs isnull()
我觉得咱要说的是pandas.DataFrame.isna() vs pandas.DataFrame.isnull()。而不是pandas.isnull(),因为它不是用于DataFrame的。
这俩函数的功用一模一样!它俩甚至连官方文档都一模一样。你点击pandas的官网文档就明白了。
但是为什么搞2个函数、取2个名字,来做同样的事儿?
这是因为pandas的DataFrame是基于R的DataFrame。在R里边na
和null
是分开的2个东西。更多相关信息请参考这篇文章。
然而,在python里边,pandas是建在numpy上的(即numpy的定制版),而numpy可是没na
,也没null
,只有NaN
的(是 “Not a Number”的缩写)。因此,pandas还用NaN
。
简单说呢就是:
- numpy里边查找
NaN
值的话,就用np.isnan()。 - pandas里边查找
NaN
值的话,要么.isna()
,要么.isnull()
。 -
NaN
源于这样一个事实:即pandas构建在numpy之上,而这两个函数的名称源自R的DataFrame,pandas就是试图模仿它的结构和功能。