数据预处理之缺失值&重复值 Posted 2021-02-19 yang9165
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据预处理之缺失值&重复值相关的知识,希望对你有一定的参考价值。
数据预处理之缺失值&重复值
import pandas as pd
import numpy as np
1 缺失值处理
data = pd.DataFrame({‘A‘:[40,np.nan,16,22,8,44],
‘B‘:[88,np.nan,66,np.nan,99,np.nan,],
‘C‘:[2,np.nan,4,np.nan,np.nan,6]})
data
A
B
C
0
40.0
88.0
2.0
1
NaN
NaN
NaN
2
16.0
66.0
4.0
3
22.0
NaN
NaN
4
8.0
99.0
NaN
5
44.0
NaN
6.0
data.info() # 查看data的信息
<class ‘pandas.core.frame.DataFrame‘>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 5 non-null float64
1 B 3 non-null float64
2 C 3 non-null float64
dtypes: float64(3)
memory usage: 272.0 bytes
data.isnull().sum() # 也可这样查看data每一行的缺失值个数
A 1
B 3
C 3
dtype: int64
1.1 删除缺失值
官方文档
dropna(axis=0, how=‘any‘, thresh=None, subset=None, inplace=False)
参数axis指轴,axis=0时表示按行,axis=1表示按列;
参数how=‘any‘时表示只要某行包含缺失值就丢弃,how=‘all‘时表示某行全部为缺失值才丢弃;
参数thresh用来指定保留包含几个非缺失值数据的行;
参数subset用来指定在判断缺失值时只考虑哪些列;
参数inplace=False时表示在副本上修改,inplace=True时表示在原对象上修改。
data.dropna(axis=0, how=‘any‘, inplace=True) # 删除data中存在缺失值的行
data
A
B
C
0
40
88.0
2.0
2
16
66.0
4.0
data.dropna(axis=0, how=‘all‘, inplace=True) # 删除data中全部为缺失值的行
data
A
B
C
0
40
88.0
2.0
2
16
66.0
4.0
3
22
NaN
NaN
4
8
99.0
NaN
5
44
NaN
6.0
data.dropna(axis=1, how=‘any‘, inplace=True) # 删除data中存在缺失值的列
data
data.dropna(axis=1, how=‘all‘, inplace=True) # 删除data中全部为缺失值的列
data
A
B
C
0
40
88.0
2.0
1
NaN
NaN
NaN
2
16
66.0
4.0
3
22
NaN
NaN
4
8
99.0
NaN
5
44
NaN
6.0
1.2 填充缺失值
1.2.1 使用均值填充
均值mean,众数mode,中值median
data.C[data.C.isnull()] = data.C.mean()
data
A
B
C
0
40
88.0
2.0
1
NaN
NaN
4.0
2
16
66.0
4.0
3
22
NaN
4.0
4
8
99.0
4.0
5
44
NaN
6.0
1.2.2 使用 fillna 函数填充
官方文档
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None) # 使用指定的方法填充NA/NaN值
参数value指用来填充Na/NaN的值,可以是标量、字典、数组、数据框,不能是列表;
参数method指填充的方法{‘backfill‘, ‘bfill‘, ‘pad‘, ‘ffill‘, None},默认None,backfill、bfill使用后一个非缺失值填充,pad、ffill使用前一个非缺失值填充;
参数axis=0时表示按行填充,axis=1表示按列填充;
参数inplace=False时表示在副本上修改,inplace=True时表示在原对象上修改。
参数limit表限制被填充的个数,默认为None。
参数downcast : dict, default is None. A dict of item->dtype of what to downcast if possible, or the string ‘infer‘ which will try to downcast to an appropriate equal type (e.g. float64 to int64 if possible).
data.fillna(0) # 使用0填充缺失值
A
B
C
0
40
88.0
2.0
1
0
0.0
0.0
2
16
66.0
4.0
3
22
0.0
0.0
4
8
99.0
0.0
5
44
0.0
6.0
data.fillna(value={‘A‘:11, ‘B‘:22, ‘C‘:66}) # 使用字典填充
A
B
C
0
40
88.0
2.0
1
11
22.0
66.0
2
16
66.0
4.0
3
22
22.0
66.0
4
8
99.0
66.0
5
44
22.0
6.0
data.fillna(method=‘ffill‘) # pad。使用前一个非缺失值填充
A
B
C
0
40
88.0
2.0
1
40
88.0
2.0
2
16
66.0
4.0
3
22
66.0
4.0
4
8
99.0
4.0
5
44
99.0
6.0
data.fillna(method=‘bfill‘) # backfill。使用后一个非缺失值填充
A
B
C
0
40
88.0
2.0
1
16
66.0
4.0
2
16
66.0
4.0
3
22
99.0
6.0
4
8
99.0
6.0
5
44
NaN
6.0
data.fillna(100, limit=1) # 限制填充的个数
A
B
C
0
40
88.0
2.0
1
100
100.0
100.0
2
16
66.0
4.0
3
22
NaN
NaN
4
8
99.0
NaN
5
44
NaN
6.0
data.A.fillna(999) # 部分数据填充
0 40
1 999
2 16
3 22
4 8
5 44
Name: A, dtype: object
1.2.3 使用 interpolate 函数填充
官方文档
interpolate(method="linear",axis=0,limit=None,inplace=False,limit_direction="forward",limit_area=None,downcast=None)
参数method指填充的方式{‘linear‘, ‘time‘, ‘index‘, ‘values‘,‘spline‘, ‘pad‘, ‘nearest‘, ‘zero‘, ‘slinear‘, ‘quadratic‘, ‘cubic‘, ‘spline‘, ‘barycentric‘, ‘polynomial‘, ‘krogh‘, ‘piecewise_polynomial‘, ‘spline‘, ‘pchip‘, ‘akima‘, ‘from_derivatives‘},默认linear,
linear:线性插值填充,用缺失值的前一个有效值和后一个有效值建立插值直线,使用缺失点在线性插值韩函数的函数值进行填充。
·slinear、polynomial:线性插值,需要设置对应的order参数,代表所使用方法的逼近次数。polynomial代表多项式插值,将order参数设置为2,代表使用二次多项式插值。
nearest:最邻近插值法。
zero:阶梯插值。
quadratic、cubic:2、3阶B样条曲线插值。
参数axis=0时表示按行,axis=1表示按列;
参数limit表限制被填充的个数,默认为None;
参数inplace=False时表示在副本上修改,inplace=True时表示在原对象上修改;
参数limit_direction指定填充的方向{‘forward‘, ‘backward‘, ‘both‘},默认为forward;
参数limit_area指定限制{None, ‘inside‘, ‘outside‘},默认None,inside仅填充被有效值包围的缺失值(interpolate),outside仅填充有效值之外的缺失值(extrapolate)
data.interpolate(method=‘linear‘) # 线性插值
A
B
C
0
40
88.0
2.000000
1
NaN
77.0
3.000000
2
16
66.0
4.000000
3
22
82.5
4.666667
4
8
99.0
5.333333
5
44
99.0
6.000000
data[‘C‘].interpolate(method=‘polynomial‘, order=2) # 使用二次多项式插值
0 2.000000
1 3.066667
2 4.000000
3 4.800000
4 5.466667
5 6.000000
Name: C, dtype: float64
2 重复值处理
data = pd.DataFrame({‘A‘:[40,66,16,22,66],
‘B‘:[4,88,5,99,88],
‘C‘:[2,33,7,20,33]})
data
A
B
C
0
40
4
2
1
66
88
33
2
16
5
7
3
22
99
20
4
66
88
33
2.1 查看重复值
data[data.duplicated()] # 查看重复值
2.2 删除重复值
data.drop_duplicates(inplace=True) # 丢弃重复值
data
A
B
C
0
40
4
2
1
66
88
33
2
16
5
7
3
22
99
20
2.3 重置索引
# 重置索引
data.reset_index(drop=True, inplace=True) # drop=True表删除原索引
data
A
B
C
0
40
4
2
1
66
88
33
2
16
5
7
4
22
99
20
以上是关于数据预处理之缺失值&重复值的主要内容,如果未能解决你的问题,请参考以下文章
数据清洗之 重复值处理
数据清洗
一文看懂数据清洗:缺失值、异常值和重复值的处理
缺失值重复值处理
机器学习数据清洗之缺失值处理缺失的原因缺失值删除缺失值填充KNN填充
机器学习数据预处理之缺失值:固定值填充