数据预处理之缺失值&重复值

Posted 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
0
1
2
3
4
5
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()]   # 查看重复值
A B C
4 66 88 33

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填充

机器学习数据预处理之缺失值:固定值填充