Python数据清洗之处理缺失值

一、缺失值的处理

1.常用方法

  • dropna
import numpy as np
import pandas as pd

string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.dropna())

这样可去除含有NA的一行

0     apple
1    banana
3    orange
dtype: object
  • fillna
string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.fillna(1))

输出结果会将NA填充为括号内的值

0     apple
1    banana
2         1
3    orange
dtype: object

另外,传入参数method=‘ffill’,可以将NA填充为前一行的值

0     apple
1    banana
2    banana
3    orange
dtype: object

同理,传入method=‘bfill’,将NA填充为后一行的值

0     apple
1    banana
2    orange
3    orange
dtype: object
  • isnull

该方法返回哪些值是缺失值的布尔值

string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.isnull())
0    False
1    False
2     True
3    False
dtype: bool
  • notnull

与isnull互为反函数

string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.notnull())
0     True
1     True
2    False
3     True
dtype: bool

2.过滤缺失值
dropna默认情况下会删除包含缺失值的行,当处理DataFrame对象时会比Series复杂一些,因为DataFrame既有行又有列,这种情况可以给dropna传入参数来满足不同的需求。

data = pd.DataFrame(np.arange(16).reshape(4,4))
data.iloc[1,1:] = np.nan
data.iloc[2,:] = np.nan
data.iloc[:,3] = np.nan
data[0][3] = np.nan
print(data)
     0     1     2   3
0  0.0   1.0   2.0 NaN
1  4.0   NaN   NaN NaN
2  NaN   NaN   NaN NaN
3  NaN  13.0  14.0 NaN
  • how

给dropna传入how=‘all’时,将删除所有值均为NA的行

print(data.dropna(how='all'))
     0     1     2   3
0  0.0   1.0   2.0 NaN
1  4.0   NaN   NaN NaN
3  NaN  13.0  14.0 NaN
  • axis

给dropna传入axis=1时,将删除的维度转变为按行删除,即删除列(易搞混)

print(data.dropna(how='all',axis=1))
     0     1     2
0  0.0   1.0   2.0
1  4.0   NaN   NaN
2  NaN   NaN   NaN
3  NaN  13.0  14.0
  • thresh
df = pd.DataFrame(np.arange(21).reshape(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)

    0     1     2
0   0   NaN   NaN
1   3   NaN   NaN
2   6   NaN   8.0
3   9   NaN  11.0
4  12  13.0  14.0
5  15  16.0  17.0
6  18  19.0  20.0

给dropna传入thresh=2,将输出至少含2个非NA值的行

print(df.dropna(thresh=2))
    0     1     2
2   6   NaN   8.0
3   9   NaN  11.0
4  12  13.0  14.0
5  15  16.0  17.0
6  18  19.0  20.0

3.补全缺失值
大多数情况下,主要使用fillna来补全缺失值,下面介绍fillna的参数。

  • Value

调用fillna时,可以使用一个常数/字符串来替代缺失值

df = pd.DataFrame(np.arange(21).reshape(7,3),dtype=float)
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df.fillna(99))
      0     1     2
0   0.0  99.0  99.0
1   3.0  99.0  99.0
2   6.0  99.0   8.0
3   9.0  99.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0

调用fillna时使用字典,可以为不同列设定不同的填充值

print(df.fillna({1:22,2:33}))
      0     1     2
0   0.0  22.0  33.0
1   3.0  22.0  33.0
2   6.0  22.0   8.0
3   9.0  22.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0
  • method

给fillna传入method=‘ffill’或method=‘bfill’,将NA值填充为前一行值或后一行值,如果没有其他参数,默认是‘ffill’

print(df.fillna(method='bfill'))
      0     1     2
0   0.0  13.0   8.0
1   3.0  13.0   8.0
2   6.0  13.0   8.0
3   9.0  13.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0
  • axis

给fillna传入axis=1,将填充方向转变为按列填充,即横向填充(这里极易搞混),若无规定,默认为axis=0

print(df.fillna(method='ffill',axis=1))
      0     1     2
0   0.0   0.0   0.0
1   3.0   3.0   3.0
2   6.0   6.0   8.0
3   9.0   9.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0
  • limit

给fillna传入limit参数用于规定前向或后向填充时的最大的填充范围

print(df.fillna(method='ffill',axis=1,limit=1))

      0     1     2
0   0.0   0.0   NaN
1   3.0   3.0   NaN
2   6.0   6.0   8.0
3   9.0   9.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0
  • inplace
    fillna默认返回的是一个新的对象,如果想要修改原对象,则要传入参数inplace=True
_ = df.fillna(22,inplace=True)
print(df)
      0     1     2
0   0.0  22.0  22.0
1   3.0  22.0  22.0
2   6.0  22.0   8.0
3   9.0  22.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
6  18.0  19.0  20.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值