Pandas之Dropna和FillNa方法 郝伟 2021/08/18 [TOC]
1. 简介
通常,输入的数据都会有各类问题,其中一个最为常见问题就是空值。数据中的空值有的可以接受(如备注信息),有的不能接受(如一些名称)。在生成了DataFrame对象后,我们可以使用库提供的dropna和fillna来处理。这两个函数分别表示删除空值和使用指定值填充空值。由于两者使用方法非常接近,所以本文以dropna进行介绍,关于fillna的使用方法,可以参考官方文档。
2. 函数定义
根据官网接口文档,dropna共有以下几个参数:
- axis : {0 or ‘index’, 1 or ‘columns’}, 默认值为 0 指定按行(axis=0)还是按列(axis=1)来处理数据。
- how : {‘any’, ‘all’}
以何种方式来验证数据,包括两个值:
- any: 只要指定的行或列中有空值, 则删除数据;
- all: 在指定的行或列中必需全部为空值才会删除数据。
- thresh : int, 默认值为 None,表示不使用此参数; 即threshhold,筛选的阀值,只有非空值不小于thresh时,才会被保留,示例可参见此文;
- subset : array-like 指定子列(或行)进行操作,见以下示例。
- inplace : boolean, 默认值 False 是否在df对象中操作,设置为True则会直接操作df对象。
3. 示例
在本示例中,使用常规的几个参数进行演示。
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再说几句,可以参考网站。
4. 小结
通过使用dropna或fillna,可以非常方便地对数据源进行初步的预处理,将所有的空值根据需求进行删除或填充。给数据准备工作提供了极大的便利。