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,可以非常方便地对数据源进行初步的预处理,将所有的空值根据需求进行删除或填充。给数据准备工作提供了极大的便利。

results matching ""

    No results matching ""