据说数据清洗占数据分析工作的80%, 迅速,正确的将数据进行清洗将提高数据分析的效率.

数据分析步骤:

一. 提出问题 提出业务指标

二. 理解数据

第一步:准备工作(安装xlrd包,导入包) activate py3,conda install xlrd,import pandas as pd

第二步:读取excel数据 pd.read_excel

第三步:打印前几行 df.head()

第四步:查看多少行 多少列 df.shape

第五步:查看列的数据类型 df.dtype / df.loc[ : ,'列名'].dtype

第六步:每一列的统计量 df. describe()

三. 数据清洗

1)选择子集 df.loc[行:行,列:列] 例如: df.loc[0:4,'购药时间':'销售数量']

2)列名重命名 Dict={旧列名:新列名} df.rename(columns=Dict,inplace=True)

字符串转数值: df[列名].astype(‘转换后的数据类型’)

字符串转日期: pd.to_datetime(df[列名] ,format='日期格式')

4)数据排序 df.sort_values(by=列名,ascending=True) df.reset_index(drop=True)

5)缺失值处理 识别: df.isnull().any() / df.isnull().all() /http://df.info()

删除: df.dropna(subset=[列名1,列名2],how='any')

填补: df.fillna(method='替换值' , inplace = True)

6)重复项处理 识别: 按照行展示: df.duplicated() / 数据多,展示重复值行df[df.duplicated()]

df.列名.unique()(在已经确定该列不应该存在重复项的前提下)

删除: df.drop_duplicates(subset=[列名1,列名2])

7)异常值处理 识别并挑选: df.describe()èquerySer=df.loc[: , 列名]>0 df.loc[querySer, : ]

8)字段拆分合并 def函数 调用函数 赋值给列 / str.split(', ')

9)行列转置

三. 构建模型 业务指标的理解和计算

四. 数据可视化

python缺失值有3种:None,NA,NaN

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉。

None和NaN的区别:None是Python的一种数据类型,NaN是浮点类型 两个都用作空值。

1)rename

inplace:inplace=False,数据框本身不变,会创建一个新的数据框,默认是False。inplace=True,数据框本身会改动。

2)to_datetime

format :日期的格式

errors='coerce' :表示原始数据不符合日期的格式,转换后的值为空值NaT

3)sort_values

by:按哪几列排序

ascending=True 表示升序排列,ascending=True表示降序排列

na_position='first'表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值

4)df.isnull().any() 获得含有NA的列

df.isnull().all() 获得全部为NA的列

5)Dropna

axis=0应用于列,axis=1应用于行,默认=0。

how='any'表示存在任何NA值,删除该行或列。how='all'表示所有值都是NA,则删除该行或列,默认='any'。

subset为可选参数,存放删除列的列表。

6)drop_duplicates

keep ='first' 保留第一个,删除后余重复值,默认为first。'last' 是删除前面,保留最后一个。

7)运算符“//”

表示取整除,返回商的整数部分,例如9//2 输出结果是4

附上案例:药店销售数据分析

需要安装一个读取excel文件的依赖包:xlrd,安装步骤如下:

1)先在conda中进入当前notebook文件所在的python环境,例如命令:

activate py3

2)在conda进入的python环境下安装该包:

conda install xlrd

#导入数据分析包

import pandas as pd

1.提出问题

从销售数据中分析出以下业务指标: 1)月均消费次数2)月均消费金额3)客单价4)消费趋势

'''路径中最好不要有中文,或者特殊符号啥的,不然路径会提示错误找不到。最后将文件放到一个简单的英文路径下'''

#读取Ecxcel数据,统一先按照字符串读入,之后转换

#在Python中\是转义符,\u表示其后是UNICODE编码,因此\User在这里会报错,在字符串前面加个r

fileNameStr=r'C:\Users\celia.yang\朝阳医院2018年销售数据.xlsx'

xlsx=pd.ExcelFile(fileNameStr,dtype='object')

salesDf=xlsx.parse('Sheet1',dtype='object')

'''查看数据基本信息'''

#打印出前5行,以确保数据运行正常

salesDf.head()

购药时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 星期五 001616528 236701 强力VC银翘片 6 82.8 69 1 2018-01-02 星期六 001616528 236701 清热解毒口服液 1 28 24.64 2 2018-01-06 星期三 0012602828 236701 感康 2 16.8 15 3 2018-01-11 星期一 0010070343428 236701 三九感冒灵 1 28 28 4 2018-01-15 星期五 00101554328 236701 三九感冒灵 8 224 208

#有多少行,多少列

salesDf.shape

(6578, 7)

#查看每一列的数据类型

salesDf.dtypes

购药时间 object

社保卡号 object

商品编码 object

商品名称 object

销售数量 object

应收金额 object

实收金额 object

dtype: object

#查看描述统计信息

salesDf.describe()

购药时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 count 6576 6576 6577 6577 6577 6577.0 6577.0 unique 202 2426 86 78 28 443.0 774.0 top 2018-04-15 星期五 001616528 2367011 苯磺酸氨氯地平片(安内真) 2 56.0 50.0 freq 228 253 622 899 3345 361.0 215.0

2.数据清洗

1)选择子集(本案例不需要选择子集)

#注释掉

#subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']

2)列名重命名

#字典:旧列名和新列名对应关系

colNameDict={'购药时间':'销售时间'}

'''inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是Falseinplace=True,数据框本身会改动'''

salesDf.rename(columns = colNameDict,inplace=True)

salesDf.head()

销售时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 星期五 001616528 236701 强力VC银翘片 6 82.8 69 1 2018-01-02 星期六 001616528 236701 清热解毒口服液 1 28 24.64 2 2018-01-06 星期三 0012602828 236701 感康 2 16.8 15 3 2018-01-11 星期一 0010070343428 236701 三九感冒灵 1 28 28 4 2018-01-15 星期五 00101554328 236701 三九感冒灵 8 224 208

3.缺失数据处理

python缺失值有3种:

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉

所以,缺失值有3种:None,NA,NaN

print('删除缺失值前大小',salesDf.shape)

删除缺失值前大小 (6578, 7)

#删除列(销售时间,社保卡号)中为空的行

#how='any' 在给定的任何一列中有缺失值就删除

salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')

print('删除缺失后大小',salesDf.shape)

删除缺失后大小 (6575, 7)

4.数据类型转换

字符串转换为数值(浮点型)

#字符串转换为数值(浮点型)

salesDf['销售数量'] = salesDf['销售数量'].astype('float')

salesDf['应收金额'] = salesDf['应收金额'].astype('float')

salesDf['实收金额'] = salesDf['实收金额'].astype('float')

print('转换后的数据类型:\n',salesDf.dtypes)

'''运行后,会报警告SettingWithCopyWarning一般信息有两列,一类是Warning警告信息,一类是Error错误信息。警告的信息不用管,我们只关注错误类型的信息'''

转换后的数据类型:

销售时间 object

社保卡号 object

商品编码 object

商品名称 object

销售数量 float64

应收金额 float64

实收金额 float64

dtype: object

字符串转换为日期数据类型

#测试:字符串分割

testList='2018-01-01 星期一'.split(' ')

testList

['2018-01-01', '星期一']

testList[0]

'2018-01-01'

'''定义函数:分割销售日期,获取销售日期输入:timeColSer 销售时间这一列,是个Series数据类型输出:分割后的时间,返回也是个Series数据类型'''

def splitSaletime(timeDateSer):

timelist=[]

for value in timeDateSer:

dateStr=value.split(' ')[0]

timelist.append(dateStr)

timeSer=pd.Series(timelist)

return timeSer

#获取“销售时间”这一列

timeSer=salesDf.loc[:,'销售时间']

#对字符串进行分割,获取销售日期

dateSer=splitSaletime(timeSer)

'''注意:如果运行后报错:AttributeError: 'float' object has no attribute 'split'是因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理。所以要先去除NaN在进行分隔字符串'''

None和NaN有什么区别呢:

None是Python的一种数据类型,NaN是浮点类型 两个都用作空值

#None和NaN的区别

print('None的数据类型',type(None))

from numpy import NaN

print('NaN的数据类型',type(NaN))

None的数据类型

NaN的数据类型

dateSer[0:3]

0 2018-01-01

1 2018-01-02

2 2018-01-06

dtype: object

#修改销售时间这一列的值

salesDf.loc[:,'销售时间']=dateSer

salesDf.head()

销售时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 001616528 236701 强力VC银翘片 6.0 82.8 69.00 1 2018-01-02 001616528 236701 清热解毒口服液 1.0 28.0 24.64 2 2018-01-06 0012602828 236701 感康 2.0 16.8 15.00 3 2018-01-11 0010070343428 236701 三九感冒灵 1.0 28.0 28.00 4 2018-01-15 00101554328 236701 三九感冒灵 8.0 224.0 208.00

'''数据类型转换:字符串转换为日期'''

#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT

#format 是你原始数据中日期的格式

salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce')

salesDf.dtypes

销售时间 datetime64[ns]

社保卡号 object

商品编码 object

商品名称 object

销售数量 float64

应收金额 float64

实收金额 float64

dtype: object

'''转换日期过程中不符合日期格式的数值会被转换为空值,这里删除列(销售时间,社保卡号)中为空的行'''

salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')

5.数据排序

print('排序前的数据集')

salesDf.head()

排序前的数据集

销售时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 001616528 236701 强力VC银翘片 6.0 82.8 69.00 1 2018-01-02 001616528 236701 清热解毒口服液 1.0 28.0 24.64 2 2018-01-06 0012602828 236701 感康 2.0 16.8 15.00 3 2018-01-11 0010070343428 236701 三九感冒灵 1.0 28.0 28.00 4 2018-01-15 00101554328 236701 三九感冒灵 8.0 224.0 208.00

#按销售日期进行升序排列

salesDf=salesDf.sort_values(by='销售时间',ascending=True,na_position='first')

print('排序后的数据集')

salesDf.head()

排序后的数据集

销售时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 001616528 236701 强力VC银翘片 6.0 82.8 69.0 3436 2018-01-01 0010616728 865099 硝苯地平片(心痛定) 2.0 3.4 3.0 1190 2018-01-01 0010073966328 861409 非洛地平缓释片(波依定) 5.0 162.5 145.0 3859 2018-01-01 0010073966328 866634 硝苯地平控释片(欣然) 6.0 111.0 92.5 3888 2018-01-01 0010014289328 866851 缬沙坦分散片(易达乐) 1.0 26.0 23.0

#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值

salesDf=salesDf.reset_index(drop=True)

salesDf.head()

销售时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 0 2018-01-01 001616528 236701 强力VC银翘片 6.0 82.8 69.0 1 2018-01-01 0010616728 865099 硝苯地平片(心痛定) 2.0 3.4 3.0 2 2018-01-01 0010073966328 861409 非洛地平缓释片(波依定) 5.0 162.5 145.0 3 2018-01-01 0010073966328 866634 硝苯地平控释片(欣然) 6.0 111.0 92.5 4 2018-01-01 0010014289328 866851 缬沙坦分散片(易达乐) 1.0 26.0 23.0

6.异常值处理

#描述指标:查看出“销售数量”值不能小于0

salesDf.describe()

销售数量 应收金额 实收金额 count 6549.000000 6549.000000 6549.000000 mean 2.384486 50.449076 46.284370 std 2.375227 87.696401 81.058426 min -10.000000 -374.000000 -374.000000 25% 1.000000 14.000000 12.320000 50% 2.000000 28.000000 26.500000 75% 2.000000 59.600000 53.000000 max 50.000000 2950.000000 2650.000000

#删除异常值:通过条件判断筛选出数据

#查询条件

querySer=salesDf.loc[:,'销售数量']>0

#应用查询条件

print('删除异常值前:',salesDf.shape)

salesDf=salesDf.loc[querySer,:]

print('删除异常值后:',salesDf.shape)

删除异常值前: (6549, 7)

删除异常值后: (6506, 7)

4.构建模型

业务指标1:月均消费次数=总消费次数 / 月份数

'''总消费次数:同一天内,同一个人发生的所有消费算作一次消费#根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除'''

kpi1_Df=salesDf.drop_duplicates(

subset=['销售时间', '社保卡号']

)

#总消费次数:有多少行

totalI=kpi1_Df.shape[0]

print('总消费次数=',totalI)

'''计算月份数:时间范围'''

#第1步:按销售时间升序排序

kpi1_Df=kpi1_Df.sort_values(by='销售时间',

ascending=True)

#重命名行名(index)

kpi1_Df=kpi1_Df.reset_index(drop=True)

kpi1_Df.head()

#第2步:获取时间范围

#最小时间值

startTime=kpi1_Df.loc[0,'销售时间']

#最大时间值

endTime=kpi1_Df.loc[totalI-1,'销售时间']

#第3步:计算月份数

#天数

daysI=(endTime-startTime).days

#月份数: 运算符“//”表示取整除

#返回商的整数部分,例如9//2 输出结果是4

monthsI=daysI//30

print('月份数:',monthsI)

#业务指标1:月均消费次数=总消费次数 / 月份数

kpi1_I=totalI // monthsI

print('业务指标1:月均消费次数=',kpi1_I)

指标2:月均消费金额 = 总消费金额 / 月份数

#总消费金额

totalMoneyF=salesDf.loc[:,'实收金额'].sum()

#月均消费金额

monthMoneyF=totalMoneyF / monthsI

print('业务指标2:月均消费金额=',monthMoneyF)

指标3:客单价=总消费金额 / 总消费次数

客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额。

'''totalMoneyF:总消费金额totalI:总消费次数'''

pct=totalMoneyF / totalI

print('客单价:',pct)

python用xlrd怎么清洗数据_利用Python进行数据清洗相关推荐

  1. python用xlrd怎么清洗数据_用Python进行数据清洗!

    导读:数据清洗是数据分析的必备环节,在进行分析过程中,会有很多不符合分析要求的数据,例如重复.错误.缺失.异常类数据. Python资源共享群:626017123 01 重复值处理 数据录入过程.数据 ...

  2. python爬取电脑本地数据_利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息...

    原标题:利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息 新型肺炎肆虐全国,可以预知,最近一两年地理学中会有一部分论文研究新型肺炎的空间分布及与其他指标的关联分析.获取其患病人 ...

  3. python匹配excel相同的数据_利用Python实现Excel的文件间的数据匹配功能

    我们知道Excel有一个match函数,可以做数据匹配. 比如要根据人名获取成绩 而参考表sheet1的内容如下: 要根据sheet1匹配每人的成绩,用Excel是这么写 index(Sheet1!B ...

  4. python获取股票逐笔交易数据_利用python下载股票交易数据

    前段时间玩Python时无意看到了获取股票交易数据的tushare模块,由于自己对股票交易挺有兴趣,加上现在又在做数据挖掘工作,故想先将股票数据下载到数据库中,以便日后分析: # 导入需要用到的模块 ...

  5. python处理行情数据_利用Python脚本来获取期货行情数据

    因为自己最近在学习做期货交易,想要下载期货的行情数据来做分析.有一些交易软件是可以导出数据的,但是导出的过程还是需要很多的手工操作,自己在想能不能通过Python程序来实现呢. 新浪期货数据接口介绍 ...

  6. python把汉字变成拼音英文_利用python将表格中的汉字转化为拼音

    GB18030的字符集标准 http://zbgb5.com/2/StandardDetail479488.htm 缺少包时用pip install 进行安装,例如: pip install xlsx ...

  7. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  8. python处理nc数据_利用python如何处理nc数据详解

    利用python如何处理nc数据详解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  利用python如何处理nc数据详解.txt ] (友情提示:右键点上行txt ...

  9. dataframe修改数据_利用Python进行数据分析(语法篇)

    一.数据 结构化数据: 1.多维数组--矩阵 2.表格型数据(关系型数据库中的数据) 3.通过关键列相连接的表 4.间隔平均或者不平均的时间序列 二.关于iPython 三.Numpy学习 numpy ...

最新文章

  1. 使用Bot Service创建Bot Framework
  2. linux7开放3306端口,CentOS 7 开放3306端口访问
  3. 7添加静态路由 hat red_两个不同网段的路由器,如何互通?
  4. java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)
  5. php上js实现ajax请求,原生JS如何实现Ajax通过POST方式与PHP进行交互的方法
  6. Visual Studio 2005 编译的版本无法启动,出现应用程序配置不正确的错误
  7. 卡巴斯基误杀奇虎360
  8. UE4物理模块(二)---建立物体碰撞
  9. 书籍推荐——按角色划分
  10. Android系统 miui主题6,miui主题工具-miui主题工具最新版v2.6.2 安卓版_永辉资源网
  11. eclipse 每次打开 提示 subversive svn connectors
  12. 【历史上的今天】1 月 17 日:VirtualBox 诞生;杨致远辞职;风暴蠕虫问世
  13. php 过滤微信符号昵称,PHP处理微信昵称特殊符号过滤方法
  14. 从日文输入法项目看心理模型和实现模型
  15. 阿里云python中文社区_一文详解如何用 python 做中文分词-阿里云开发者社区
  16. 用一维字符数组方法输出下面的图形
  17. 《容忍与自由》读后感
  18. 会导致肝损伤的保健品和中草药
  19. Verilog组合逻辑设计
  20. 从玄学到网红,互联网企业取名有何学问?

热门文章

  1. 优秀ppt作品范例_毕业论文答辩ppt模板优秀范例
  2. 管理计算机中木桶原理,管理学中有个木桶原理美文摘抄
  3. C++基础与深度解析第七章:深入IO
  4. Python跨目录引用模块(文件)
  5. C++之继承探究(四):继承的使用
  6. linux shell指令 amp,shell入门基础amp;常见命令及用法
  7. java poi 导出excel 速度慢_java POI技术之导出数据优化(15万条数据1分多钟)
  8. java main方法static_在java中为什么要把main方法定义为一个static方法?
  9. 计算机没有cpu会怎么样,电脑cpu不好会怎么样
  10. java48关键_Java48个关键字速查表