数据大清洗_Pandas库进阶(数据重复值处理)(数据缺失值处理)

一、处理重复值

1、记录重复

即一个或者多个特征某几个记录的值完全相同。

方法:
方法一: 利用列表(list)去重,自定义去重函数。
在这里插入图片描述
方法二:是利用集合(set)的元素是唯一的特性去重,如 dish_set=set(dishes)。 比较上述两种方法可以发现,方法一代码冗长。方法二代码简单了许多,但会导致数据的排列发生改变。

方法三:(推荐) pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者 Series 类型有效。这种方法不会改变数据原始排列,并且兼具代码简洁和运行稳定的特点。
该方法不仅支持单一特征的数据去重,还能够依据 DataFrame 的其中一个或者几个特征进行去重操作。

pandas.DataFrame(Series).drop_duplicates(self,subset=None,keep='first',inplace=False)

在这里插入图片描述

代码实现:

import pandas as pd


# 加载detatil数据
detail = pd.read_excel('./meal_order_detail.xlsx')
print(detail)

detail.drop_duplicates(subset="dishes_name", inplace=True)
print("去重后的结果为:",detail.shape)

打印结果:
在这里插入图片描述

2、特征重复

结合相关的数学和统计学知识,去除连续型特征重复可以利用特征间的相似度将两个相似度为 1 的特征去除一个。在 pandas 中相似度的计算方法为 corr,使用该方法计算相似度时,默认为“pearson”法 ,可以通过“method”参数调节,目前还支持“spearman”法和“kendall”法。

但是通过相似度矩阵去重存在一个弊端,该方法只能对数值型重复特征去重,类别型特征之间无法通过计算相似系数来衡量相似度。

代码实现:

import pandas as pd


# 加载detatil数据
detail = pd.read_excel('./meal_order_detail.xlsx')
# print(detail)
# 
# detail.drop_duplicates(subset="dishes_name", inplace=True)
# print("去重后的结果为:",detail.shape)


# 计算 amounts counts 相关性
method: {'pearson', 'kendall', 'spearman'}
# 默认的是皮尔逊相关系数
print('两列之间相关性计算:\n', detail.loc[:, ['amounts', 'counts']].corr())
print('两列之间相关性计算:\n', detail.loc[:, ['amounts', 'counts']].corr(method='kendall'))
print('两列之间相关性计算:\n', detail.loc[:, ['amounts', 'counts']].corr(method='spearman'))

# 负相关 ---相关性较弱了

打印结果:
在这里插入图片描述

二、处理缺失值

1、检测缺失值

利用 isnull 或 notnull 找到缺失值
数据中的某个或某些特征的值是不完整的,这些值称为缺失值。
pandas 提供了识别缺失值的方法 isnull 以及识别非缺失值的方法 notnull,这两种方法在使用时返回的都是布尔值 True 和 False。

结合 sum 函数和 isnull、notnull 函数,可以检测数据中缺失值的分布以及数据中一共含有多少缺失值。

2、处理缺失值

(1)删除法

删除法分为删除观测记录和删除特征两种,它属于利用减少样本量来换取信息完整度的一种方法,是一种最简单的缺失值处理方法。

Pandas 中提供了简便的删除缺失值的方法 dropna,该方法既可以删除观测记录,亦可以删除特征。

pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None,inplace=False)

在这里插入图片描述

(2)替换法

替换法是指用一个特定的值替换缺失值。特征可分为数值型和类别型,两者出现缺失值时的处理方法也是不同的。

缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。

缺失值所在特征为类别型时,则选择使用众数来替换缺失值。

Pandas 库中提供了缺失值替换的方法名为 fillna,其基本语法如下。

pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False,limit=None)

在这里插入图片描述

(3)插值法

删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会
影响数据的标准差,导致信息量变动。在面对数据缺失问题时,除了这两种方法之外,还有
一种常用的方法—插值法。
常用的插值法有线性插值、多项式插值和样条插值等:
线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解线性方
程得到缺失值。
多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用
这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值——推荐和牛顿插值等。
样条插值是以可变样条来作出一条经过一系列点的光滑曲线的插值方法,插值样条由一
些多项式组成,每一个多项式都是由相邻两个数据点决定,这样可以保证两个相邻多项式及
其导数在连接处连续。
从拟合结果可以看出多项式插值和样条插值在两种情况下拟合都非常出色,线性插值法
只在自变量和因变量为线性关系的情况下拟合才较为出色。
而在实际分析过程中,自变量与因变量的关系是线性的情况非常少见,所以在大多数情
况下,多项式插值和样条插值是较为合适的选择。

(4)特殊字符缺失值

在数据中有时还存在着特殊字符的缺失值,如: “*”, “?”,":","-"等特殊字符。

针对这样的缺失值,首先先要利用 replace 函数替换为能处理的缺失值,如: np.nan 类型, 再进行删除、填充、插值等处理。

代码实现

# 缺失值---空缺的值
import pandas as pd
import numpy as np

# 想要处理缺失值 ---判定数据中是否存在缺失值???
# 加载数据
# data = pd.read_excel('./qs.xlsx')
# print('data:\n', data)
# print('data:\n', data.shape)
# print('*' * 100)

# 检测缺失值
# isnull --判定,如果是缺失值,---True  如果不是,---False --和sum连用 --统计各列的缺失值个数
# notnull --判定,如果有值,True,如果缺失,--False,和sum连用 --count类似--统计非空数据的数目
# print('缺失值检测:\n', pd.isnull(data).sum()) ---推荐
# print('缺失值检测:\n', pd.notnull(data).sum())

# 缺失值处理方式:
# (1)删除法
# 删除--drop  ---删除指定的行列
# 删除法 ---删除缺失值 ---dropna
# 可以使用dropna来进行删除缺失值
# axis 指定删除的方向,axis=0 --->删除行,axis=1 删除列
# inplace  是否对原df产生影响,如果为True,即对原df直接删除缺失值,
# 如果为False,即返回一个删除之后的结果,并不会对原df产生影响
# how --->any ---只要存在缺失值,就进行删除
#     --->all ---只有全部都为缺失的情况下,才进行删除
# data.dropna(axis=0, how='any', inplace=True)
# data.dropna(axis=1, how='any', inplace=True)
# data.dropna(axis=0, how='all', inplace=True)
# print('删除缺失值之后的结果:\n', data)
# 注意:删除法不能随意使用,可能会造成数据的大量丢失,只有在整行、整列全部为空或者大部分为空的情况下,才进行删除


# # (2)填充法
# # 利用指标数据进行填充
# # 可以使用众数、均值、中位数、或者上下邻居来进行填充
# # 可以对类别型数据 使用众数、上下邻居来填充
# # 如:价格--连续的float小数---连续型数据---众数、均值、中位数、上下邻居来填充
#
# # # 使用众数来填充 商品ID 这一列数据
# # # 如果想使用其他指标进行填充---先计算出对应的指标,然后进行fillna
# # # a、计算众数
# mode = data.loc[:, '商品ID'].mode()[0]
# print('mode:\n', mode)
# # # b、进行填充
# data.loc[:, '商品ID'].fillna(value=mode, inplace=True)
#
# # 使用上邻居来填充 类别ID
# # ffil pad表示上一个非缺失的值
# # backfill bfill表示下一个非缺失的值
# data.loc[:, '类别ID'].fillna(method='pad', inplace=True)
#
# # 使用上下邻居来填充 门店编号
# data.loc[:, '门店编号'].fillna(method='bfill', inplace=True)
#
# print('填充之后的结果:\n', data)
# # 注意:填充法可能会导致数据的分布规律发生变化,从而影响结果


# (3)插值法
# 拟合一定的关系来进行数据的填充
# 常用的差值法
# 线性插值---拟合线性关系
# 多项式插值(拉格朗日插值) ---拟合拉格朗日多项式关系
# 样条插值--拟合样条曲线关系

# 导入插值模块
from scipy.interpolate import interp1d  # 线性插值模块
from scipy.interpolate import lagrange  # 拉格朗日插值模块
# from scipy.interpolate import spline  # 样条插值模块(新版本--移除了,使用interp1d进行样条插值)

# 创建插值数据
# 用现有的数据---去拟合未知的数据
# 长度一样的
x = np.array([1, 2, 3, 4, 5, 8, 9])
y = np.array([3, 5, 7, 9, 11, 17, 19])
z = np.array([2, 8, 18, 32, 50, 128, 162])

# 使用x来分别按照线性插值、拉格朗日插值、样条插值 来 拟合出 y z中缺失的值
# 线性插值
# x-->用来拟合的数据
# y --->需要被拟合的数据
# 用x 来拟合y
#  kind='linear' ---线性的拟合
linear_1 = interp1d(x=x, y=y, kind='linear')
linear_2 = interp1d(x=x, y=z, kind='linear')

print('使用线性拟合来拟合数据:\n', linear_1([6, 7]))  # [ 13.  15.]
print('使用线性拟合来拟合数据:\n', linear_2([6, 7]))  # [  76.  102.]

# (3)插值法
# 拟合一定的关系来进行数据的填充
# 常用的差值法
# 线性插值---拟合线性关系
# 多项式插值(拉格朗日插值) ---拟合拉格朗日多项式关系
# 样条插值--拟合样条曲线关系

# 导入插值模块
from scipy.interpolate import interp1d  # 线性插值模块
from scipy.interpolate import lagrange  # 拉格朗日插值模块
# from scipy.interpolate import spline  # 样条插值模块(新版本--移除了,使用interp1d进行样条插值)

# 创建插值数据
# 用现有的数据---去拟合未知的数据

# 长度一样的
x = np.array([1, 2, 3, 4, 5, 8, 9])
y = np.array([3, 5, 7, 9, 11, 17, 19])  # y = 2 * x + 1
z = np.array([2, 8, 18, 32, 50, 128, 162])  # z = 2 * x ^ 2

# 使用x来分别按照线性插值、拉格朗日插值、样条插值 来 拟合出 y z中缺失的值


# 线性插值
# 使用 interp1d 进行曲线插值(样条插值)
# l1 = interp1d(x=x, y=y, kind='cubic')
# l2 = interp1d(x=x, y=z, kind='cubic')
# print('使用interp1d来进行曲线插值:\n', l1([6, 7]))  # [ 13.  15.]
# print('使用interp1d来进行曲线插值:\n', l2([6, 7]))  # [ 72.  98.]



# 拉格朗日插值
# 使用x 借助拉格朗日多项式 来拟合 y z
# 拉格朗日插值模块
# x --->用来拟合的数据
# w --->需要被拟合的数据
# la1 = lagrange(x=x, w=y)
# la2 = lagrange(x=x, w=z)
#
# print('使用拉格朗日拟合数据:\n', la1([6, 7]))  # [ 13.  15.]
# print('使用拉格朗日拟合数据:\n', la2([6, 7]))  # [ 72.  98.]



# 样条插值
# xk--->用来拟合的数据
# yk ---> 需要被拟合的数据
# print(spline(xk=x, yk=y, xnew=[6, 7]))  # [ 13.  15.]
# print(spline(xk=x, yk=z, xnew=[6, 7]))  # [ 72.  98.]


# 在使用 插值法,
# 如果真实数据的关系 是线性的, 那么使用线性插值、拉格朗日插值、样条插值---结果都是可以接受的
# 如果真实数据的关系 是非线性的,那么使用线性插值的结果与真实结果存在差异,
# 而样条插值、拉格朗日插值效果明显会比线性插值较好一些

# 如果遇到插值 ---推荐使用拉格朗日插值、样条插值

# 特殊字符的缺失值--无法检测 如:* ? : ' ' !  ...


# 特殊值处理
# 加载数据
data = pd.read_excel('./qs.xlsx')
print('data:\n', data)

# 按照门店编号分组,看 商品ID 出现次数
# res = data.groupby(by='门店编号')['商品ID'].count()
# print('res:\n',res)

# 如果发现特殊字符之后?
# 先将特殊字符替换为 可以处理的 NaN 类型
# 参数1 : 特殊字符
# 参数2 : np.nan
# inplace
data.replace('*', np.nan, inplace=True)
print('data:\n', data)
print('*' * 100)

# 检测
res_null = pd.isnull(data).sum()
print('检测结果:\n', res_null)
print('*' * 100)



  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值