python数据预处理

python数据预处理

数据预处理是后续数据分析处理的前提,包括数据探究,缺失值、异常值,重复值等数据处理,数据标准化、归一化、离散化处理。

数据查看

#读取出来dataframe格式
import pandas as pd
import openpyxl
import numpy as np
data=pd.read_excel(‘D:\Python27\pyhton3\mjtq.xlsx’,engine=‘openpyxl’)
data.describe()方法获取数值型变量的分布情况,即描述性统计
data.shape方法返回的元组表示df表有xxx行xx列数据

缺失值处理

(一)判断缺失值。首先判断数据是否存在缺失值,一种是键入info()查看数据类型等信息;另一种是isnull()方法,该方法是基于该命令的两个返回值True和False予以判断,如果是True。notnull():缺失值为False,非缺失值为True则表示对应的行列位置就是缺失值。
data.isnull().count_values() #返回缺失值个数
(二)处理缺失值。缺失值的处理方式有两种,一种是删除,即丢弃pandas中任何含有数据缺失值的行:

cleaned和dropna函数;
// An highlighted block
s.dropna(inplace=True)
df1=df[['value1','value2']].dropna()
print(df1.isnull().sum())

另一种是填充,即把缺失的那部分数据用某个值代替。具体命令如下:
填充/替换缺失数据 - fillna、replace
填充的数据可以是平均数、中位数、众数或者0。或者采用拉格朗日插值法。
data.fillna(0,inplace = True) #填充为0

用缺失值之前、之后的数据填充
df['value1'].fillna(method='pad',inplace=True)

method参数:
pad / ffill → 用之前的数据填充
backfill / bfill → 用之后的数据填充
print(df[‘value1’])

替换缺失值
df['value2'].replace([1,2,3],np.nan,inplace=True)
#缺失值插补(mean,median,mode,ffill,lagrange)
#分别求出均值/中位数/众数
u=s.mean()
me=s.median()  #中位数
mod=s.mode() #众数
print('均值为:%.2f,中位数为:%.2f'%(u,me))
print('众数为:',mod.tolist())
# 用均值填补
s.fillna(u,inplace = True)
print(s)
#用中位数填补
s.fillna(me,inplace = True)
print(s)
#用众数填补
s.fillna(mod,inplace = True)
print(s)
#临近值填补
#用前值插补
s.fillna(method='ffill',inplace=True)
#拉格朗日插值法
def insertinto(s,n,k=5):
    y=s[list(range(n-k,n))+list(range(n+1,n+k+1))]
    y=y[notnull()]
    return lagrange(y.index,list(y))(n)

重复数据处理

(一)检查重复数据。使用df.duplicated().value_counts()统计重复值个数;键入df.duplicated()则直接返回一个布尔值,根据布尔值True判断各行是否为重复行
(二)处理重复数据。如果重复数据较小使用df.drop_duplicates()清除重复的最后一行数据,如果重复数据较大把重复数据当做缺失值处理,填充为0、中位数、众数或者均值。

异常值分析

异常值也称离群点,异常值的分析也称为离群点的分析
(一)异常值分析
1.简单统计量
需要的统计量可以是最大值和最小值,判断这个变量的极值是否不在现实合理范围之中
data.min()
data.max()
2.箱线图分析

异常值检测。可以依据业务经验划定指标正常范围、依据箱型图上下边缘点值以及偏离正态分布一定标准差(例如3倍)等规则确定异常值。
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.figure()  # 建立图像
p = data.boxplot(return_type='dict')  # 画箱线图,直接使用DataFrame的方法
#获取异常值,'flies'为箱线图中异常值的标签
x = p['fliers'][0].get_xdata()  
y = p['fliers'][0].get_ydata()
y.sort()  # 从小到大排序,该方法直接改变原对象
for i in range(len(x)):
    if i>0:
        plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i]))
    else:
        plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i]))
plt.show()  # 展示箱线图

(二)异常值处理方法 → 删除 / 修正填补

数据标准化

1.实现中心化和正态分布的Z-Score
Z-Score标准化是基于原始数据的均值和标准差进行的标准化,假设原转换的数据为x,新数据为x’,那么x’=(x-mean)/std,其中mean和std为x所在列的均值和标准差。
这种方法适合大多数类型的数据,也是很多工具的默认标准化方法。标准化之后的数据是以0为均值,方差为1的正态分布。但是Z-Score方法是一种中心化方法,会改变原有数据的分布结构,不适合用于对稀疏数据做处理。
zscore_scaler=preprocessing.StandardScaler()
data_scaler_1=zscore_scaler.fit_transform(data)
2.实现归一化的Max-Min
Max-Min标准化方法是对原始数据进行线性变换,假设原转换的数据为x,新数据为x’,那么x’=(x-min)/(max-min),其中min和max为x所在列的最小值和最大值。
这种标准化方法的应用非常广泛,得到的数据会完全落入[0,1],区间内(Z-Score则没有类似区间),这种方法能使数据归一化而落到一定的区间内,同时还能较好地保持原有数据结构。
minmax_scaler=preprocessing.MinMaxScaler()
data_scaler_2=minmax_scaler.fit_transform(data)
3.用于稀疏数据的MaxAbs
最大值绝对值标准化(MaxAbs)即根据最大值的绝对值进行标准化,假设原转换的数据为x,新数据为x’,那么x’=x/|max|,其中max为x所在列的最大值。
MaxAbs方法跟Max-Min用法类似,也是将数据落入一定区间,但该方法的数据区间为[-1,1]。MaxAbs也具有不破坏原有数据分布结构的特点,因此也可以用于稀疏数据、稀疏的CSR或CSC矩阵。
maxabs_scaler=preprocessing.MaxAbsScaler()
data_scaler_3=maxabs_scaler.fit_transform(data)
4.针对离群点的RobustScaler
某种情况下,假如数据集中有离群点,我们可以使用Z-Score进行标准化,但是标准化之后的数据并不理想,因为异常点的特征往往在标准化之后便容易失去离群特征。此时可以使用RobustScaler针对离群点做标准化处理,该方法对数据中心化和数据的缩放健壮性有更强的参数控制能力。
robust_scaler=preprocessing.RobustScaler()
data_scaler_4=robust_scaler.fit_transform(data)
(1)如果要做中心化处理,并且对数据分布有正态需求,则使用Z-Score方法。
(2)如果要进行0-1标准化或要指定标准化后的数据分布范围,Max-Min标准化或MaxAbs标准化是比较好的选择。
(3)如果要对稀疏数据进行处理,Max-Min标准化或MaxAbs标准化仍是理想方法。
(4)如果要最大限度保留数据集中的异常,则使用RobustScaler方法。

属性归约

属性规约常用方法有:合并属性、逐步向前选择、逐步向后删除、决策树归纳、主成分分析等。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry_qqxxw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值