dataframe 中的缺失值非常常见,很有必要掌握精准识别和处理确实值的技巧。

识别缺失值

pandas 会将诸如 NaNnullNoneNA 等值视为缺失值,但是在实践中,类似 init暂无缺失 等这样的值,我们也视为缺失值,怎么把这个认知喂给 pandas 呢,有两个办法。

第一种方法是在读取文件时,比如 read_csv(),有一个参数 na_values,它接受一个 list 列表,里面的每一个值就是我们要新增的缺失值。

1
df = pd.read_csv('demo.csv',na_values=['init','暂无'])

第二个方法是读取文件后,使用 replace,如果有很多个,不可避免要使用 for 循环

1
df.replace('init', np.nan, inplace=True)

处理缺失值

两种思路,一种是去除缺失值、另外一种是填充缺失值。

去除缺失值

dataframe 内置了这个方法 dropna() ,第一个参数 axis 是老生常谈的了,会经常遇到,简单来说 axis =0 (默认值)就是一行一行的处理,axis=1 就是一列一列的处理;第二个参数 inplace 更加常见,取值 False(默认值) 时返回修改后的 dataframe,取值 True 意即原地修改,也就没有返回值。最后一个参数 how 取值为 allany 之一,前一个意思为如果这一行所有的 item 都是缺失值才去除,后者条件更加宽松:只有某一行有一个 item 是缺失值就去除。

填充缺失值

常见的填充方式也有两种,第一种是使用同列的平均值、或者中位数填充。

1
2
# price 列的缺失值用均值代替
df.fillna({'price': df['price'].mean()})

另外一种是在该列使用插值,此种方式更为优雅。

1
df['price'] = df['price'].interpolate(method='linear')

method 可以取值为:

  • slinearlinear:线性插值
  • nearest:最邻近插值法
  • 更多取值的可以参考官方文档