Pandas之Dropna和FillNa方法
郝伟 2021/08/18

简介

通常,输入的数据都会有各类问题,其中一个最为常见问题就是空值。数据中的空值有的可以接受(如备注信息),有的不能接受(如一些名称)。在生成了DataFrame对象后,我们可以使用库提供的dropna和fillna来处理。这两个函数分别表示删除空值和使用指定值填充空值。由于两者使用方法非常接近,所以本文以dropna进行介绍,关于fillna的使用方法,可以参考官方文档

函数定义

根据官网接口文档,dropna共有以下几个参数:

示例

在本示例中,使用常规的几个参数进行演示。

import pandas as pd
import numpy as np

# 官方API文档: 
# https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.DataFrame.dropna.html

data = {
    'name': ['Tom', np.nan, 'Jack', 'Lucy', None], 
    'sex': ['male', 'female', 'male', None, None],
    'age': [35, 24, 19, 28, None]
}

# 定义并显示df
df = pd.DataFrame(data)
print(' df '.center(60, '-'))
print(df)

# 用于存储所有输出结果
dfs=[df] * 7

# 1 删除有空值的行
dfs[1] = df.dropna()

# 2 删除任何一个单元为NaN的行
dfs[2]= df.dropna(axis=0, how='any') 

# 3 按列进行删除
dfs[3]= df.dropna(axis=1, how='all') 

# 4 按列进行删除
dfs[4]= df.dropna(axis=1, how='any') 

# 5 传入这个参数后将只丢弃全为缺失值的那些行
dfs[5] = df.dropna(how = 'all')

# 6 丢弃'name'和'age'这两列中有缺失值的行
dfs[6] = df.dropna(axis=0, subset = ['name', 'age'], how='any')

# thresh=n,至少包括n个非na值才会保留
dfs[7] = df.dropna(thresh=2)

# 显示所有数据
for i in range(len(dfs)):
    print('----- df{0} -----\n{1}'.format(i, dfs[i]))

# 对原始数据直接修改
df.dropna(axis=0, inplace=True, how='any')
print('----- {0} -----\n{1}'.format('df', df))

输出结果

---------------------------- df ----------------------------
   name     sex   age
0   Tom    male  35.0
1   NaN  female  24.0
2  Jack    male  19.0
3  Lucy    None  28.0
4  None    None   NaN
----- df0 -----      
   name     sex   age
0   Tom    male  35.0
1   NaN  female  24.0
2  Jack    male  19.0
3  Lucy    None  28.0
4  None    None   NaN
----- df1 -----
   name   sex   age
0   Tom  male  35.0
2  Jack  male  19.0
----- df2 -----
   name   sex   age
0   Tom  male  35.0
2  Jack  male  19.0
----- df3 -----
   name     sex   age
0   Tom    male  35.0
1   NaN  female  24.0
2  Jack    male  19.0
3  Lucy    None  28.0
4  None    None   NaN
----- df4 -----
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4]
----- df5 -----
   name     sex   age
0   Tom    male  35.0
1   NaN  female  24.0
2  Jack    male  19.0
3  Lucy    None  28.0
----- df6 -----
   name   sex   age
0   Tom  male  35.0
2  Jack  male  19.0
3  Lucy  None  28.0
----- df -----
   name   sex   age
0   Tom  male  35.0
2  Jack  male  19.0

关于threth再说几句,可以参考网站

小结

通过使用dropna或fillna,可以非常方便地对数据源进行初步的预处理,将所有的空值根据需求进行删除或填充。给数据准备工作提供了极大的便利。