当前位置:   article > 正文

pandas数据预处理_合并_清洗_标准化数据_转换数据_15_pandas数据预处理_标准化数据_转换数据

15_pandas数据预处理_标准化数据_转换数据

目录

1. 堆叠合并数据

1.1 横向表堆叠(axis=1,concat做行对齐)

1.2 纵向堆叠(axis=0,concat做列对齐)

1.3 主键合并数据

2.清洗数据

2.1 检测与处理重复值

3 、标准化数据

3.1离差标准化公式:

3.2标准差标准化数据:

3.3小数定标标准化公式及对比:

4.转换数据

4.1 哑变量处理类别数据

5.任务

6.相关代码参考

示例1:缺失值处理

示例2:异常值处理

示例3:标准化数据

示例4:数据转换


1. 堆叠合并数据

1.1 横向表堆叠(axis=1,concat做行对齐)

横向堆叠,即将两个表在X轴向拼接在一起,可以使用concat函数完成,concat函数的基本语法如下:

  1. pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
  2. keys=None, levels=None, names=None, verify_integrity=False, copy=True)

常用参数如下所示:

1.2 纵向堆叠(axis=0,concat做列对齐)

1.2.1 纵向堆叠——append方法

1.3 主键合并数据

主键合并,即通过一个或多个键将两个数据集的行连接起来,类似于SQL中的JOIN。

针对同一个主键存 在两张包含不同字段的表,将其根据某几个字段一一对应拼接起来,结果集列数为两个元数据的列数和减去连接键的数量。

主键合并:merge函数:

和数据库的join一样,merge函数也有左连接(left)、右连接(right)、内连接(inner)和外连接(outer) ,但比起数据库SQL语言中的join和merge函数还有其自身独到之处,例如可以在合并过程中对数据集中的数据 进行排序等。

  1. pandas.merge(left, right, how='inner', on=None, left_on=None,
  2. right_on=None, left_index=False, right_index=False, sort=False,
  3. suffixes=('_x', '_y'), copy=True, indicator=False)

可根据merge函数中的参数说明,并按照需求修改相关参数,就可以多种方法实现主键合并。

重叠合并数据:combine_first方法

数据分析和处理过程中若出现两份数据的内容几乎一致的情况,但是某些特征在其中一张表上是完整的, 而在另外一张表上的数据则是缺失的时候,可以用combine_first方法进行重叠数据合并,其原理如下:

combine_first的具体用法如下:

 pandas.DataFrame.combine_first(other)

参数及其说明如下:

2.清洗数据

2.1 检测与处理重复值

2.1.1记录重复

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

比较上述两种方法可以发现,方法一代码冗长。方法二代码简单了许多,但会导致数据的排列发生改变。

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

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

2.1.2 特征重复

  1. 1、结合相关的数学和统计学知识,去除连续型特征重复可以利用特征间的相似度将两个相似度为1的特征去除一个。
  2. 在pandas中相似度的计算方法为corr,使用该方法计算相似度时,默认为“pearson”法 ,
  3. 可以通过“method”参数调节,目前还支持“spearman”法和“kendall”法。
  4. 2、但是通过相似度矩阵去重存在一个弊端,该方法只能对数值型重复特征去重,
  5. 类别型特征之间无法通过计 算相似系数来衡量相似度。
  6. 3、除了使用相似度矩阵进行特征去重之外,可以通过DataFrame.equals的方法进行特征去重。

利用 isnull 或 notnull 找到缺失值:

  1. 1、数据中的某个或某些特征的值是不完整的,这些值称为缺失值。
  2. 2、pandas提供了识别缺失值的方法isnull以及识别非缺失值的方法notnull,这两种方法在使用时
  3. 返回的都是布尔值TrueFalse
  4. 3、结合sum函数和isnull、notnull函数,可以检测数据中缺失值的分布以及数据中一共含有多少缺失值。
  5. 4、isnull和notnull之间结果正好相反,因此使用其中任意一个都可以判断出数据中缺失值的位置。

1.删除法:

  1. 1、删除法分为删除观测记录和删除特征两种,它属于利用减少样本量来换取信息完整度的一种方法,
  2. 是一种最简 单的缺失值处理方法。
  3. 2、pandas中提供了简便的删除缺失值的方法dropna,该方法既可以删除观测记录,亦可以删除特征。
  4. pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)

常用参数及其说明如下:

2.替换法

  1. 1、替换法是指用一个特定的值替换缺失值。
  2. 2、特征可分为数值型和类别型,两者出现缺失值时的处理方法也是不同的。
  3. • 缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。
  4. • 缺失值所在特征为类别型时,则选择使用众数来替换缺失值。

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

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

常用参数及其说明如下。

3.插值法

  1. 1、删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会影响数据的标准差, 导致信息量变动。在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法—插值法。
  2. 2、常用的插值法有线性插值、多项式插值和样条插值等:
  3. • 线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,
  4. 通过求解线性方程得到缺失值。
  5. • 多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,
  6. 再利用这个多项式求解 缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等。
  7. • 样条插值是以可变样条来作出一条经过一系列点的光滑曲线的插值方法,
  8. 插值样条由一些多项式组成, 每一个多项式都是由相邻两个数据点决定,
  9. 这样可以保证两个相邻多项式及其导数在连接处连续。

异常值:

  1. 1、异常值是指数据中个别值的数值明显偏离其余的数值,有时也称为离群点,
  2. 检测异常值就是检验数据中是 否有录入错误以及是否含有不合理的数据。
  3. 2、异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,
  4. 那么会对结果会产生不良影响, 从而导致分析结果产生偏差乃至错误。

常用的异常值检测主要为3σ原则和箱线图分析两种方法。

1.3σ原则

3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得 到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。

这种判别处理方法仅适用于对正态或近似正态分布的样本数据进行处理,如下表所示,其中σ代表标准差, μ代表均值,x=μ为图形的对称轴。

数据的数值分布几乎全部集中在区间(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不到0.3%。故根据小概率原 理,可以认为超出3σ的部分数据为异常数据。

2.箱线图分析

箱型图提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。 • QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。

  1. • QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。
  2. • IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的一半。
  1. 箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,
  2. 且没有对数据做任何限制性要求, 其判断异常值的标准以四分位数和四分位数间距为基础。
  3. 四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,
  4. 25%的数据可以变得任意 远而不会很大地扰动四分位数,
  5. 所以异常值通常不能对这个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,
  6. 因此在识别异常值方面具有一定的优越性。

3 、标准化数据

3.1离差标准化公式:

离差标准化的特点:
数据的整体分布情况并不会随离差标准化而发生改变,原先取值较大的数据,在做完离差标准化后的值依 旧较大。

当数据和最小值相等的时候,通过离差标准化可以发现数据变为0。

若数据极差过大就会出现数据在离差标准化后数据之间的差值非常小的情况。

同时,还可以看出离差标准化的缺点:
若数据集中某个数值很大,则离差标准化的值就会接近于0,并且相互之间差别不大。若将来遇到超过目前属性[min,max]取值范围的时候,会引起系统出错,这时便需要 重新确定min和max。

 

3.2标准差标准化数据:

3.3小数定标标准化公式及对比:

4.转换数据

4.1 哑变量处理类别数据

哑变量处理:
数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只 有数值型,还会存在相当一部分的类别型,这部分的特征需要经过哑变量处理才可以放入模型之中。哑变 量处理的原理示例如图。

get_dummies函数:

Python中可以利用pandas库中的get_dummies函数对类别型特征进行哑变量处理。

  1. pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False,
  2. columns=None,sparse=False, drop_first=False)

哑变量处理的特点:
1、对于一个类别型特征,若其取值有m个,则经过哑变量处理后就变成了m个二元特征,并且这些特征互斥, 每次只有一个激活,这使得数据变得稀疏。

2、对类别型特征进行哑变量处理主要解决了部分算法模型无法处理类别型数据的问题,这在一定程度上起到 了扩充特征的作用。由于数据变成了稀疏矩阵的形式,因此也加速了算法模型的运算速度。

4.2 离散化连续数据

1、某些模型算法,特别是某些分类算法如ID3决策树算法和 Apriori算法等,要求数据是离散的,此时就需要将连续型特
征(数值型)变换成离散型特征(类别型)。

2、连续特征的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不 同的符号或整数值代表落在每个子区间中的数据值。

3、因此离散化涉及两个子任务,即确定分类数以及如何将连续 型数据映射到这些类别型数据上。其原理如图。

1.等宽法

将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者用户指定,与制作频率分布表 类似。pandas提供了cut函数,可以进行连续型数据的等宽离散化,其基础语法格式如下。

  1. pandas.cut(x, bins, right=True, labels=None, retbins=False,
  2. precision=3, include_lowest=False)

使用等宽法离散化的缺陷为:等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目 也会变得非常不均匀,有些区间包含许多数据,而另外一些区间的数据极少,这会严重损坏所建立的模型。

2.等频法

  1. 1、cut函数虽然不能够直接实现等频离散化,但是可以通过定义将相同数量的记录放进每个区间。
  2. 2、等频法离散化的方法相比较于等宽法离散化而言,避免了类分布不均匀的问题,
  3. 但同时却也有可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。

3.基于聚类分析的方法

  1. 1、一维聚类的方法包括两个步骤:
  2. • 将连续型数据用聚类算法(如K-Means算法等)进行聚类。
  3. • 处理聚类得到的簇,将合并到一个簇的连续型数据做同一标记。
  4. 2、聚类分析的离散化方法需要用户指定簇的个数,用来决定产生的区间数。
  5. 3、k-Means聚类分析的离散化方法可以很好地根据现有特征的数据分布状况进行聚类,
  6. 但是由于k-Means 算法本身的缺陷,用该方法进行离散化时依旧需要指定离散化后类别的数目。
  7. 此时需要配合聚类算法评价
  8. 方法,找出最优的聚类簇数目。

5.任务

6.相关代码参考

示例1:缺失值处理

  1. import pandas as pd
  2. import numpy as np
  3. # 加载数据
  4. data = pd.read_excel("./qs.xlsx")
  5. print("data:\n",data)
  6. # 检测 是否存在缺失值?---bool_df ---经常与sum连用
  7. # print(pd.isnull(data))
  8. # print(pd.notnull(data))
  9. # 推荐使用isnull和sum 连用
  10. print(pd.isnull(data).sum()) # 只要存在大于0 结果---存在缺失值
  11. # print(data.shape)
  12. # print(pd.notnull(data).sum()) # 需要将结果与shape[0]进行对比,如果不同---存在缺失值
  13. # 如果存在缺失值,缺失值处理。
  14. # 3 种
  15. # 删除---直接删除---如果存在缺失值,就直接删除
  16. # 填充--直接填充--根据列的某项指标进行填充
  17. # 插值 --在列里面查找规律
  18. # 删除法
  19. # axis --按行 删除 还是按列删除
  20. # how --any 只要有缺失值,就删除
  21. # how --all 只有全行 或者全列都为缺失值,才删除
  22. # data.dropna(how='any',axis=0,inplace=True)
  23. # data.dropna(how='all',axis=0,inplace=True)
  24. # print("data:\n",data)
  25. # 删除detail 里面全是缺失值的列
  26. # detail = pd.read_excel("./meal_order_detail.xlsx")
  27. # print("detail 的形状:\n",detail.shape)
  28. # # 检测 缺失值
  29. # print(pd.isnull(detail).sum())
  30. # # 删除全是空的列
  31. # detail.dropna(how='all',axis=1,inplace=True)
  32. # print("删除全是空之后的形状:\n",detail.shape)
  33. # 如果说 整列数据全部都是一样的?是否对结果在这一列产生影响???
  34. # 数据都是一样的,那么对结果在这个列指标产生的影响是一样的。
  35. # 判断每一列数值是否全部重复? ---??怎么做?
  36. # res = drop_duplicates(subset='列名',axis=1,inplace=False)
  37. # res.shape[0] == 1
  38. #
  39. # drop_list = []
  40. #
  41. # for tmp in detail.columns:
  42. # # 去重,并进行结果展示
  43. # res = detail.drop_duplicates(subset=tmp,inplace=False)
  44. # if res.shape[0] == 1:
  45. # drop_list.append(tmp)
  46. #
  47. # # 删除
  48. # detail.drop(labels=drop_list,axis=1,inplace=True)
  49. #
  50. # print("删除所有数据单一的列之后:\n",detail.shape)
  51. # 如果 数据里面 所有的列上都存在缺失值而且缺失值分布在不同的行,要是删除,会造成大量数据的丢失
  52. # 如果 整列、或者整行 存在大部分缺失值,我们就进行删除
  53. # # 填充法
  54. #
  55. # print("data 的数据类型:\n",data.dtypes)
  56. #
  57. # # 进行填充--需要指定填充的值--数值型 可以使用均值、中位数、众数
  58. # # 利用均值进行填充 商品ID 列 ---真实情况,商品ID是固定的,不能随便创造,所以用median 或者mode进行填充
  59. # # data['商品ID'].fillna(data['商品ID'].mean(),inplace=True)
  60. # data['商品ID'].fillna(data['商品ID'].mode()[0],inplace=True)
  61. # # 利用 中位数 进行填充 商品ID 列
  62. # data['类别ID'].fillna(data['类别ID'].median(),inplace=True)
  63. # # 利用 众数 进行填充 门店编号 列
  64. # data['门店编号'].fillna(data['门店编号'].mode()[0],inplace=True)
  65. #
  66. # print(data)
  67. #
  68. # # 我们fillna dropna 针对的类型空值,np.nan类型---float类型
  69. # # 如果缺失值类型不是np.nan类型 ,先替换成np.nan类型 在进行删除、填充等等一系列操作
  70. # data.replace("*",np.nan,inplace=True)
  71. #
  72. # print(data)
  73. #
  74. #
  75. # # 利用 众数 进行填充 门店编号 列
  76. # data['门店编号'].fillna(data['门店编号'].mode()[0],inplace=True)
  77. #
  78. # print(data)
  79. # 插值法
  80. # 线性插值 ---拟合线性关系
  81. # 多项式插值 --拉格朗日、牛顿-拟合多项式---
  82. # 样条插值 --- 拟合光滑曲线
  83. # 如何做?
  84. x = np.array([1,2,3,4,5,8,9]) # 利用x 来拟合 y z 的缺失值
  85. y = np.array([3,5,7,9,11,17,19]) # 2 * x + 1
  86. z = np.array([2,8,18,32,50,128,162]) # 2 * x^2
  87. # 线性插值
  88. from scipy.interpolate import interp1d
  89. pld_1 = interp1d(x,y,kind='linear') # [ 13. 15.]
  90. pld_2 = interp1d(x,z,kind='linear') # [ 76. 102.]
  91. # print(pld_1([6,7]))
  92. # print(pld_2([6,7]))
  93. # 拉格朗日多项式插值
  94. from scipy.interpolate import lagrange
  95. la1 = lagrange(x,y) # [ 13. 15.]
  96. la2 = lagrange(x,z) # [ 72. 98.]
  97. # print(la1([6,7]))
  98. # print(la2([6,7]))
  99. # 样条插值
  100. from scipy.interpolate import spline
  101. print(spline(xk=x,yk=y,xnew=[6,7])) # [ 13. 15.]
  102. print(spline(xk=x,yk=z,xnew=[6,7])) # [ 72. 98.]
  103. # 线性插值,对于线性拟合问题,效果不错,但是非线性问题,效果不好
  104. # 多项式插值、样条插值 对于线性问题、非线性问题效果都不错,推荐使用下面这两种

示例2:异常值处理

  1. import pandas as pd
  2. # 正态分布
  3. # 3sigma ---> mean() - 3* std() ---下限
  4. # mean() + 3* std() ---上限
  5. # 自实现3sigma 原则
  6. def three_sigma(ser):
  7. """
  8. 自实现3sigma 原则
  9. :param ser: 数据
  10. :return: 处理完成的数据
  11. """
  12. bool_id = ((ser.mean() - 3 * ser.std()) <= ser) & (ser <= (ser.mean() + 3 * ser.std()))
  13. # bool数组索引
  14. # ser[bool_id]
  15. return ser.index[bool_id]
  16. #使用detail 验证
  17. deatil = pd.read_excel("./meal_order_detail.xlsx")
  18. print(deatil.shape)
  19. # 调用3sigma原则,进行异常值过滤
  20. index_name_list = three_sigma(deatil['amounts'])
  21. deatil = deatil.loc[index_name_list,:]
  22. print(deatil.shape)
  23. #percentile() 计算分位数
  24. # np.percentile() ql-1.5iqr qu + 1.5iqr

示例3:标准化数据

  1. import pandas as pd
  2. import numpy as np
  3. # 标准化目的:让数据统一量级
  4. # 离差标准化
  5. # (x-min) /(max- min)
  6. def minmax_sca(data):
  7. """
  8. 离差标准化
  9. :param data: df 或 ser
  10. :return: 标准化之后的数据
  11. """
  12. data = (data - data.min()) /(data.max() - data.min())
  13. return data
  14. # 标准差标准化
  15. # (x- mean())/std()
  16. def stand_sca(data):
  17. """
  18. 标准差标准化 转化完成的数据 均值为0 ,标准差为1
  19. :param data: df or ser
  20. :return: 标准化之后的数据
  21. """
  22. data = (data - data.mean()) /data.std()
  23. return data
  24. # 小数定标标准化
  25. # x / 10 ^ K
  26. # K ???
  27. # k = 向上取整 (log10(|x|.max()))
  28. def desc_sca(data):
  29. """
  30. 小数定标标准化
  31. :param data:df or ser
  32. :return: 标准化之后的数据
  33. """
  34. data = data / 10 ** np.ceil(np.log10(data.abs().max()))
  35. return data
  36. # 调用 实现标准化
  37. detail = pd.read_excel("./meal_order_detail.xlsx")
  38. # 离差标准化
  39. # detail[['amounts','counts']] = minmax_sca(detail[['amounts','counts']])
  40. # 标准差标准化
  41. # detail[['amounts','counts']] = stand_sca(detail[['amounts','counts']])
  42. # 小数定标标准化
  43. detail[['amounts','counts']] = desc_sca(detail[['amounts','counts']])
  44. print(detail[['amounts','counts']])
  45. #

示例4:数据转换

  1. import pandas as pd
  2. import numpy as np
  3. #进行将类别型数据转化为 哑变量矩阵--数值型
  4. # 加载数据
  5. detail = pd.read_excel("./meal_order_detail.xlsx")
  6. print("detail :\n",detail)
  7. print("detail 的列名称:\n",detail.columns)
  8. print("detail 的数据类型:\n",detail.dtypes)
  9. print("*"*80)
  10. # 将dishes_name转化
  11. # res = pd.get_dummies(detail['dishes_name'],prefix="菜品",prefix_sep="_")
  12. #
  13. # print("res:\n",res)
  14. # res.to_excel("./res.xlsx")
  15. # 如果遇到的是连续型数据 ---不去关系 具体的值,只关系落在哪个区间
  16. # detail['amounts'] --->分组
  17. # include_lowest 需要包含最小值
  18. # 默认分组
  19. # res_cut = pd.cut(detail['amounts'],bins=5)
  20. # 自定义分组 ----等宽法分组
  21. # num = 5
  22. #
  23. # # 最小值
  24. # min_ = detail['amounts'].min()
  25. # # 最大值
  26. # max_ = detail['amounts'].max()
  27. # # 步长
  28. #
  29. # step = np.ceil((detail['amounts'].max() - detail['amounts'].min())/num)
  30. # # 分组结果
  31. # bins = np.arange(min_,max_ + step,step)
  32. # print(bins)
  33. # 等频法进行分组 ---落在各个区间数量大致相同
  34. #
  35. # quantile 进行求取分位数
  36. bins =detail['amounts'].quantile(np.arange(0,1+0.25,0.25))
  37. print(bins)
  38. # include_lowest 自定义分组必须指定
  39. res_cut = pd.cut(detail['amounts'], bins=bins,include_lowest=True)
  40. print(res_cut)
  41. #
  42. #
  43. print("*"*80)
  44. # print(detail['amounts'].min())
  45. # print(detail['amounts'].max())
  46. # 看一下 我们分的组 具体分了哪些组
  47. res = pd.value_counts(res_cut)
  48. print(res)
  49. # 进行哑变量转化
  50. res_dum = pd.get_dummies(res_cut,prefix_sep="_",prefix="区间")
  51. print(res_dum)

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/148155
推荐阅读
相关标签
  

闽ICP备14008679号