↑↑↑点击上方蓝字,回复资料,嘿嘿,10个G的惊喜

本文简单介绍python中一些常见的数据预处理,包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。

1、 加载数据 1.1 数据读取

数据格式有很多,介绍常见的csv,txt,excel以及数据库mysql中的文件读取

import pandas as pddata = pd.read_csv(r'../filename.csv') #读取csv文件data = pd.read_table(r'../filename.txt') #读取txt文件data = pd.read_excel(r'../filename.xlsx') #读取excel文件# 获取数据库中的数据import pymysqlconn = pymysql.connect(host='localhost',user='root',passwd='12345',db='mydb') #连接数据库,注意修改成要连的数据库信息cur = conn.cursor() #创建游标cur.execute("select * from train_data limit 100") #train_data是要读取的数据名data = cur.fetchall() #获取数据cols = cur.description #获取列名conn.commit() #执行cur.close() #关闭游标conn.close() #关闭数据库连接col = []for i in cols:col.append(i[0])data = list(map(list,data))data = pd.DataFrame(data,columns=col)

1.2 CSV文件合并

实际数据可能分布在一个个的小的csv或者txt文档,而建模分析时可能需要读取所有数据,这时呢,需要将一个个小的文档合并到一个文件中

#合并多个csv文件成一个文件import glob#合并def hebing():csv_list = glob.glob('*.csv') #查看同文件夹下的csv文件数print(u'共发现%s个CSV文件'% len(csv_list))print(u'正在处理............')for i in csv_list: #循环读取同文件夹下的csv文件fr = open(i,'rb').read()with open('result.csv','ab') as f: #将结果保存为result.csvf.write(fr)print(u'合并完毕!')#去重def quchong(file):df = pd.read_csv(file,header=0)datalist = df.drop_duplicates()datalist.to_csv(file)if __name__ == '__main__':hebing()quchong("result.csv.csv")

1.3 CSV文件拆分

对于一些数据量比较大的文件,想直接读取或者打开比较困难,介绍一个可以拆分数据的方法吧,方便查看数据样式以及读取部分数据

##csv比较大,打不开,将其切分成一个个小文件,看数据形式f = open('NEW_Data.csv','r') #打开大文件i = 0 #设置计数器#这里1234567表示文件行数,如果不知道行数可用每行长度等其他条件来判断while i<1234567 :with open('newfile'+str(i),'w') as f1:for j in range(0,10000) : #这里设置每个子文件的大小if i < 1234567: #这里判断是否已结束,否则最后可能报错f1.writelines(f.readline())i = i+1else:break

1.4 数据查看

在进行数据分析前呢,可以查看一下数据的总体情况,从宏观上了解数据

data.head() #显示前五行数据data.tail() #显示末尾五行数据data.info() #查看各字段的信息data.shape #查看数据集有几行几列,data.shape[0]是行数,data.shape[1]是列数data.describe() #查看数据的大体情况,均值,最值,分位数值...data.columns.tolist() #得到列名的list

2、缺失值

现实获取的数据经常存在缺失,不完整的情况(能有数据就不错了,还想完整!!!),为了更好的分析,一般会对这些缺失数据进行识别和处理

2.1 缺失值查看print(data.isnull().sum()) #统计每列有几个缺失值missing_col = data.columns[data.isnull().any()].tolist() #找出存在缺失值的列import numpy as np#统计每个变量的缺失值占比def CountNA(data):cols = data.columns.tolist() #cols为data的所有列名n_df = data.shape[0] #n_df为数据的行数for col in cols:missing = np.count_nonzero(data[col].isnull().values) #col列中存在的缺失值个数mis_perc = float(missing) / n_df * 100print("{col}的缺失比例是{miss}%".format(col=col,miss=mis_perc))

2.2 缺失值处理

面对缺失值,一般有三种处理方法:不处理、删除以及填充

2.2.1 不处理

有的算法(贝叶斯、xgboost、神经网络等)对缺失值不敏感,或者有些字段对结果分析作用不大,此时就没必要费时费力去处理缺失值啦 =。=

2.2.2 删除

在数据量比较大时候或者一条记录中多个字段缺失,不方便填补的时候可以选择删除缺失值

data.dropna(axis=0,how="any",inplace=True) #axis=0代表'行','any'代表任何空值行,若是'all'则代表所有值都为空时,才删除该行data.dropna(axis=0,inplace=True) #删除带有空值的行data.dropna(axis=1,inplace=True) #删除带有空值的列

2.2.3 填充

数据量较少时候,以最可能的值来插补缺失值比删除全部不完全样本所产生的信息丢失要少

2.2.3.1 固定值填充

data = data.fillna(0) #缺失值全部用0插补data['col_name'] = data['col_name'].fillna('UNKNOWN') #某列缺失值用固定值插补

2.2.3.2 出现最频繁值填充

即众数插补,离散/连续数据都行,适用于名义变量,如性别

freq_port = data.col_name.dropna().mode()[0] # mode返回出现最多的数据,col_name为列名data['col_name'] = data['col_name'].fillna(freq_port) #采用出现最频繁的值插补

2.2.3.3 中位数/均值插补

data['col_name'].fillna(data['col_name'].dropna().median(),inplace=True) #中位数插补,适用于偏态分布或者有离群点的分布data['col_name'].fillna(data['col_name'].dropna().mean(),inplace=True) #均值插补,适用于正态分布

2.2.3.4 用前后数据填充

data['col_name'] = data['col_name'].fillna(method='pad') #用前一个数据填充data['col_name'] = data['col_name'].fillna(method='bfill') #用后一个数据填充

2.2.3.5 拉格朗日插值法

一般针对有序的数据,如带有时间列的数据集,且缺失值为连续型数值小批量数据

from scipy.interpolate import lagrange#自定义列向量插值函数,s为列向量,n为被插值的位置,k为取前后的数据个数,默认5def ployinterp_columns(s, n, k=5):y = s[list(range(n-k,n)) + list(range(n+1,n+1+k))] #取数y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值结果#逐个元素判断是否需要插值for i in data.columns:for j in range(len(data)):if (data[i].isnull())[j]: #如果为空即插值data[i][j] = ployinterp_columns(data[i],j)

2.2.3.6 其它插补方法最近邻插补、回归方法、牛顿插值法、随机森林填充等。

3、异常值

异常值是指样本中的个别值,其数值明显偏离它所属样本的其余观测值。异常值有时是记录错误或者其它情况导致的错误数据,有时是代表少数情况的正常值

3.1 异常值识别 3.1.1 描述性统计法

#与业务或者基本认知不符的数据,如年龄为负

neg_list = ['col_name_1','col_name_2','col_name_3']for item in neg_list:neg_item = data[item] < 0print(item + '小于0的有' + str(neg_item.sum())+'个')#删除小于0的记录for item in neg_list:data = data[(data[item]>=0)]

3.1.2 三西格玛法

当数据服从正态分布时,99.7%的数值应该位于距离均值3个标准差之内的距离,P(|xμ|>3σ)≤0.003

#当数值超出这个距离,可以认为它是异常值for item in neg_list:data[item + '_zscore'] = (data[item] - data[item].mean()) / data[item].std()z_abnormal = abs(data[item + '_zscore']) > 3print(item + '中有' + str(z_abnormal.sum())+'个异常值')

3.1.3 箱型图

#IQR(差值) = U(上四分位数) - L(下四分位数)#上界 = U + 1.5IQR#下界 = L-1.5IQRfor item in neg_list:IQR = data[item].quantile(0.75) - data[item].quantile(0.25)q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5*IQRq_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5*IQRprint(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum())+'个异常值')

3.1.4 其它

基于聚类方法检测、基于密度的离群点检测、基于近邻度的离群点检测等。

3.2 异常值处理

对于异常值,可以删除,可以不处理,也可以视作缺失值进行处理。

4、描述性变量转换为数值型

大部分机器学习算法要求输入的数据必须是数字,不能是字符串,这就要求将数据中的描述性变量(如性别)转换为数值型数据

#寻找描述变量,并将其存储到cat_vars这个list中去cat_vars = []print('\n描述变量有:')cols = data.columns.tolist()for col in cols:if data[col].dtype == 'object':print(col)cat_vars.append(col)···##若变量是有序的##print('\n开始转换描述变量...')from sklearn import preprocessingle = preprocessing.LabelEncoder()#将描述变量自动转换为数值型变量,并将转换后的数据附加到原始数据上for col in cat_vars:tran = le.fit_transform(data[col].tolist())tran_df = pd.DataFrame(tran,columns=['num_'+col])print('{col}经过转化为{num_col}'.format(col=col,num_col='num_'+col))data = pd.concat([data, tran_df], axis=1)del data[col] #删除原来的列##若变量是无序变量###值得注意的是one-hot可能引发维度爆炸for col in cat_vars:onehot_tran = pd.get_dummies(data.col)data = data.join(onehot_tran) #将one-hot后的数据添加到data中del data[col] #删除原来的列

5、训练测试集划分

实际在建模前大多需要对数据进行训练集和测试集划分,此处介绍两种划分方式

法一、直接调用train_test_split函数from sklearn.model_selection import train_test_splitX = data.drop('目标列',1) #X是特征列y = data['目标列'] #y是目标列X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)

法二:随机抽样

#随机选数据作为测试集test_data = data.sample(frac=0.3,replace=False,random_state=123,axis=0)#frac是抽取30%的数据,replace是否为有放回抽样,取replace=True时为有放回抽样,axis=0是抽取行、为1时抽取列#在data中除去test_data,剩余数据为训练集train_data = (data.append(test_data)).drop_duplicates(keep=False)X_train = train_data.drop('目标列',1)X_test = test_data.drop('目标列',1)y_train = train_data['目标列']y_test = test_data['目标列']

6、数据规范化

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。一些需要数据规范化的算法:LR、SVM、KNN、KMeans、GBDT、AdaBoost、神经网络等

6.1 最小最大规范化

对原始数据进行线性变换,变换到[0,1]区间。计算公式为:x* = (x-x.min)/(x.max-x.min)

from sklearn.preprocessing import MinMaxScalerx_scaler = MinMaxScaler()y_scaler = MinMaxScaler()#特征归一化x_train_sca = x_scaler.fit_transform(X_train)x_test_sca = x_scaler.transform(X_test)y_train_sca = y_scaler.fit_transform(pd.DataFrame(y_train))

6.2 零均值规范化

对原始数据进行线性变换,经过处理的数据的均值为0,标准差为1。计算方式是将特征值减去均值,除以标准差。计算公式为:x* = (x-x.mean)/σ

from sklearn.preprocessing import StandardScaler#一般把train和test集放在一起做标准化,或者在train集上做标准化后,用同样的标准化器去标准化test集scaler = StandardScaler()train = scaler.fit_transform(train)test = scaler.transform(test)

作者:GC_AIDM

https://www.cnblogs.com/shenggang/p/12133278.html

—END—

hych666」,欢迎添加我的微信,更多精彩,尽在我的朋友圈 。

python数据预处理的代码_【Python基础系列】常见的数据预处理方法(附代码)相关推荐

  1. word转换为html代码,如何将Word转换为网页html格式的方法(附代码清理方法)

    Word是我们常用的的办公软件,广泛被运用,那么我们怎么把Word转换为网页html格式? 需要软件: word2003 或 wps 个人建议用wps更方便,word生成的图片容易重复 photosh ...

  2. Python编程语言学习:sklearn.manifold的TSNE函数的简介、使用方法、代码实现之详细攻略

    Python编程语言学习:sklearn.manifold的TSNE函数的简介.使用方法.代码实现之详细攻略 目录 Manifold简介 TSNE简介-数据降维且可视化 TSNE使用方法 TSNE代码 ...

  3. java实现生日提醒_asp实现的可以提醒生日的几种方法附代码

    asp实现的可以提醒生日的几种方法附代码 更新时间:2008年06月20日 08:44:52   作者: asp提醒生日的原理一般就是把用户的出生日期和当前日期对比,如果少于几天则提醒显示,下面是几种 ...

  4. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  5. python数据标准化代码_可能是最全的数据标准化教程(附python代码)

    什么是数据标准化(归一化) 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标 ...

  6. python后端开发学什么_零基础学Python,这是阿里Python8年开发经验写给你的学习路线图...

    今天给大家分享一位前辈整理的一个Python web学习路线.这位前辈由于有编程基础,所以采用了自学Python的方式.学完后主要做后端开发.希望对你有所启发. 整理的一个 python web 学习 ...

  7. 零基础轻松学python pdf 小码哥_零基础轻松学Python

    零基础轻松学Python电子书 Python之父Guido van Rossum力荐的Python门书.本书以通俗易懂的语言.好玩有趣的案例让读者轻轻松松.循序渐地从零始掌握Python 3 编程.本 ...

  8. python输出一棵松树_零基础学Python--------第8章 模块

    第8章 模块 8.1 模块概述 模块的英文是Modules,可以认为是一盒(箱)主题积木,通过它可以拼出某一个主题的东西.这与第6章介绍的函数不同,一个函数相当于一块积木,而一个模块中可以包括很多函数 ...

  9. python处理excel表格入门_零基础使用Python读写处理Excel表格

    引 由于需要解决大批量Excel处理的事情,与其手工操作还不如写个简单的代码来处理,大致选了一下感觉还是Python最容易操作. 安装库 Python环境 首先当然是配环境,不过选Python的一个重 ...

  10. python自学看不懂怎么办_零基础学习python但是基础教程一看到后面就开始看不懂了,怎么办?...

    廖大的教程看不懂不要担心,简明教程也看不下去也不要怕,世界上总有人基础比你好的,不过我们可以用笨办法来学习python. 0,先找一个python3版本的<笨办法学python>,从头看, ...

最新文章

  1. Windows Server 2008 R2 之二十九故障转移群集(一)(
  2. DotNet Framework源代码调试问题
  3. Quasar和Akka –比较
  4. 图形学 射线相交算法_计算机图形学中的阴极射线管
  5. 技术宅的乐趣!网友编写出《流浪地球》“春节十二响”C语言源码
  6. mysql统计age大于20的数_数据库命令记录
  7. JBPM中文乱码的一种解决方法
  8. 解读 2018之Go语言篇(上):为什么Go语言越来越热?
  9. vue中如何实现pdf文件预览?
  10. php的cvs,php基于Fleaphp框架实现cvs数据导入MySQL的方法
  11. 编写测试报告,及测试报告模板
  12. J2me 开源的wap浏览器源代码分析
  13. 零极限:关于蓝色太阳水原理
  14. 根据关键词采集文章php,如何通过文章采集获取一篇高质量的网站内容
  15. js验证手机号、身份证号
  16. C语言程序设计-鸡兔同笼问题
  17. windows server 2008解决 远程桌面多帐号同时登录
  18. 【java】java学习笔记之java oop(面向对象)
  19. Android 设计模式之MVC,从一个实例中来理解MVC
  20. 爱搞事情:我的黑苹果日记之安装路

热门文章

  1. DataFrame的loc,iloc访问方式
  2. sigterm信号_一文吃透 PHP 进程信号处理
  3. 一、实战-压测流程,总概述
  4. S5PV210中的定时器
  5. javascript 时间刻度尺 ruler 插件
  6. 将搭建在树莓派上的leanote用frp映射到自己的域名
  7. Ford Brings New Focus To Small-Car Market
  8. html在线编辑器添加附件,HTML 编辑器 FCKeditor使用详解
  9. 我从外包公司离职了…
  10. ASP.NET Core(.NET Core)中使用HtmlDecode和HtmlEncode方法