(四)数据整合清洗


在进行数据处理过程中,面对多张数据表,需要对多张表的字段进行合并于提取,即数据整合;整合好的数据很可能存在错误和异常,需要进行数据清洗。

1 数据整合

数据整合:对数据进行列选择、创建、删除等基本操作。
数据整合普遍适用的方法是SQL。

SQL语句介绍

Select数据查询是最核心和常用的操作

import pandas as pd
import os

导入数据

os.chdir(r'D:\python商业实践\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\源代码\Python_book\5Preprocessing')
sale=pd.read_csv(r'sale.csv',encoding='gbk')   #数据集中含中文 encoding='gbk'

在这里插入图片描述

import sqlite3                    #sqlite3相当于轻量版,更多功能使用SQLAlchemy
con=sqlite3.connect(':memory:')   #数据库连接,将数据在内存中
sale.to_sql('sale',con)           #将DataFrame注册成可用sql查询的表,注册到con中
  • 选择表中指定列
    pd.read_sql_query (select <目标列> from <sql可查询的表> , 内存)
newTable=pd.read_sql_query('select year,sale,profit from sale',con)  #选择year,sale,profit列

在这里插入图片描述

  • 选择所有列
    select * from sale
sqlResult = pd.read_sql_query('select * from sale', con)
  • 选择满足条件的行
    select * from sale where 目标
    #指定目标条件为字符需加引号,数字不需加引号,若要求多个条件用where in('指定1','指定2 ','...')
pd.read_sql_query("select * from sale where market in ('东','西') and year=2012", con)   #选择出2012年且market在东和西的销售额

在这里插入图片描述

  • 对行进行排序
    order by 表名
    #默认为升序,降序则为order by sale desc
sql = '''select year, market, sale, profit
      from sale
      order by sale desc'''
pd.read_sql_query(sql, con)

在这里插入图片描述

  • 删除某列重复的行
pd.read_sql_query("select DISTINCT year from sale", con)

在这里插入图片描述

2 数据清洗

数据问题类型

  1. 脏数据或错误数据
  2. 数据不一致:人为肉眼修正
  3. 数据重复:去重
  4. 缺失值:填补
  5. 离群值 ,离群值不一定就是错误值

读取数据

camp=pd.read_csv('teleco_camp_orig.csv')

在这里插入图片描述

2.1 错误值处理

识别噪声
利用图形快速对数据进行初步分析:直方图、饼图、条形图、折线图、散点图等。一般情况,连续变量选择直方图,分类变量选择柱形图或饼状图
错误值->改正、缺失值替代

导入绘图所需的包

import matplotlib.pyplot as plt

绘制直方图

plt.hist(camp['AvgIncome'],bins=20)  #查看分布状况
camp['AvgIncome'].describe()

在这里插入图片描述
判断这里的0为缺失值

camp['AvgIncome']=camp['AvgIncome'].replace({0: np.NaN}) #将0替换为NaN
plt.hist(camp['AvgIncome'], bins=20,range=(camp.AvgIncome.min(),camp.AvgIncome.max())) #由于数据中存在缺失值,需要指定绘图的值域
camp['AvgIncome'].describe(include='all')

在这里插入图片描述

2.2 缺失值处理

缺失值->.填补

  • 缺失值少于20%,连续变量使用均值或中位数填补;分类变量不需要填补,单算一类即可,或者用众数填补。
  • 缺失值在20%~80%,用上述方法填补,同时每个有缺失值的变量生成一个指示哑变量,参与后续建模。
  • 缺失值在大于80%,每个有缺失值的变量生成一个指示哑变量,参与后续建模,原变量不适用。

#不完整数据->填补后变量、缺失值指示变量

查看统计量

camp.describe()     #如果count数量少于样本量,说明存在缺失,Age缺失了大概20%

在这里插入图片描述
用均值填补缺失值

vmean=camp['Age'].mean(axis=0,skipna=True) #计算均值 skipna=True去掉缺失值后的均值
camp['Age_empflag']=camp['Age'].isnull()   #产生虚拟指标/指示变量
camp['Age']=camp['Age'].fillna(vmean)      #用均值填补缺失值
camp['Age'].describe()

在这里插入图片描述

2.3 噪声值处理

  • 单变量离群值发现
    极端值,设置标准值
    离群值,平均值法、四分位数法

  • 单变量离群处理方法
    1.剔除法
    2.盖帽法:小于1%、大于99%替代

定义盖帽法函数

def blk(floor,root):     # 'blk' will return a function
    def f(x):
        if x<floor:
            x=floor
        elif x>root:
            x=root
        return x
    return f
q1=camp['Age'].quantile(0.01)   #计算百分数
q99=camp['Age'].quantile(0.99)
blk_tot=blk(floor=q1,root=q99)
camp['Age']=camp['Age'].map(blk_tot)
camp['Age'].describe()

在这里插入图片描述
在这里插入图片描述

3.分箱法

  • 等宽分箱:按照值域分组
    pd.qcut()
camp['Age_group1'] = pd.qcut( camp['Age'], 4) # 等宽分为四份
camp.Age_group1

在这里插入图片描述

  • 等深分箱:按照百分数分,每组样本量一样
    pd.cut
camp['Age_group2'] = pd.cut( camp['Age'], 4)  
camp.Age_group2.head()

输出干净数据

camp.to_csv('tele_camp_ok.csv') 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值