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

先导入需要的模块

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
ABC
040.088.02.0
1NaNNaNNaN
216.066.04.0
322.0NaNNaN
48.099.0NaN
544.0NaN6.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
ABC
04088.02.0
21666.04.0



data.dropna(axis=0, how='all', inplace=True)   # 删除data中全部为缺失值的行
data
ABC
04088.02.0
21666.04.0
322NaNNaN
4899.0NaN
544NaN6.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
ABC
04088.02.0
1NaNNaNNaN
21666.04.0
322NaNNaN
4899.0NaN
544NaN6.0



1.2 填充缺失值

1.2.1 使用均值填充

均值mean,众数mode,中值median

data.C[data.C.isnull()] = data.C.mean()
data
ABC
04088.02.0
1NaNNaN4.0
21666.04.0
322NaN4.0
4899.04.0
544NaN6.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填充缺失值
ABC
04088.02.0
100.00.0
21666.04.0
3220.00.0
4899.00.0
5440.06.0



data.fillna(value={'A':11, 'B':22, 'C':66})   # 使用字典填充
ABC
04088.02.0
11122.066.0
21666.04.0
32222.066.0
4899.066.0
54422.06.0



data.fillna(method='ffill')   # pad。使用前一个非缺失值填充
ABC
04088.02.0
14088.02.0
21666.04.0
32266.04.0
4899.04.0
54499.06.0



data.fillna(method='bfill')    # backfill。使用后一个非缺失值填充
ABC
04088.02.0
11666.04.0
21666.04.0
32299.06.0
4899.06.0
544NaN6.0



data.fillna(100, limit=1)   # 限制填充的个数
ABC
04088.02.0
1100100.0100.0
21666.04.0
322NaNNaN
4899.0NaN
544NaN6.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')   # 线性插值
ABC
04088.02.000000
1NaN77.03.000000
21666.04.000000
32282.54.666667
4899.05.333333
54499.06.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
ABC
04042
1668833
21657
3229920
4668833



2.1 查看重复值

data[data.duplicated()]   # 查看重复值
ABC
4668833



2.2 删除重复值

data.drop_duplicates(inplace=True)     # 丢弃重复值
data
ABC
04042
1668833
21657
3229920



2.3 重置索引

# 重置索引
data.reset_index(drop=True, inplace=True)   # drop=True表删除原索引
data
ABC
04042
1668833
21657
4229920
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值