Python数据分析入门案例
转载自 https://blog.csdn.net/lijinlon/article/details/81517699
Data analysis by Python 入门
1. 重复数据处理
在DataFrame中主要运用duplicated方法和drop_duplicates方法:
- duplicated方法返回的是一个布尔型的Series,用来只是各行是否重复,如果重复则为True,否则为False。
- drop_duplicates直接返回已经删除了重复行的DataFrame。
默认drop_duplicates方法会判断所有列,只有所有列的值都重复才算重复行,如果仅需要依据某一列或者某几列进行重复项判断。可以添加列名的列表:drop_duplicates([‘K1’])或者drop_duplicates([‘K1’,’K2’])。删除的重复值可以选择保留第一项还是最后一项,添加 keep = ‘last’,会保留最后一个重复值,keep = ‘first’会保留第一个重复值。
1.1 Excel文件读取
pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel 2003(或更高版本)中的表格型数据。这两个工具分别使用扩展包xlrd和openpyxl读取XLS和XLSX文件。你可以用pip或conda安装它们。
要使用ExcelFile,通过传递xls或xlsx路径创建一个实例,然后用存储在表单中的数据可以read_excel读取到DataFrame
import pandas as pd
xlsx = pd.ExcelFile('H:/DataAnalysis/data/ch04/4.2/重复数据处理.xls')
frame = pd.read_excel(xlsx, 'Sheet1')
frame
# 也可以直接用read_excel读取
# frame = pd.read_excel('H:/DataAnalysis/data/ch04/4.2/重复数据处理.xls', 'Sheet1')
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
编号 | |
---|---|
0 | A667708 |
1 | A310882 |
2 | A356517 |
3 | A520304 |
4 | A776477 |
5 | A466074 |
6 | A466074 |
7 | A466074 |
8 | A776477 |
9 | A218912 |
1.2 重复数据处理
使用DataFrame的drop_duplicates()进行重复数据的删除
frame_ = frame.drop_duplicates(keep = 'last')
# keep = 'last',会保留最后一个重复值,keep = 'first'会保留第一个重复值
frame_
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
编号 | |
---|---|
0 | A667708 |
1 | A310882 |
2 | A356517 |
3 | A520304 |
7 | A466074 |
8 | A776477 |
9 | A218912 |
处理数据另存为Excel文件
如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter,然后使用pandas对象的to_excel方法将 数据写入到其中:
writer = pd.ExcelWriter('H:/DataAnalysis/data/ch04/4.2/重复数据处理_处理后.xls')
frame_.to_excel(writer, 'Sheet1')
writer.save()
# 当然,你还可以不使用ExcelWriter,而是传递文件的路径到to_excel:
# frame.to_excel('H:/DataAnalysis/data/ch04/4.2/重复数据处理_处理后.xls')
2. 检查数据逻辑错误
逻辑错误是根据数据来源、数据性质等进行判断的,比如年龄出现负值等等。
这里的例子是在多选题中需要选择3项,为0代表未选择,不为0代表选择,所以需要判断每一行数据中不为0的个数是否等于3.
因为原先的xls文件有合并单元格,首先手动将其删除,只留下标题列ABCDEFG和表内容。
frame2 = pd.read_excel('H:/DataAnalysis/data/ch04/4.2/检查数据逻辑错误.xls', 'Sheet1')
frame2_ = frame2.copy()
frame2_
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
A | B | C | D | E | F | G | |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 |
2 | 1 | 0 | 1 | 0 | 2 | 0 | 0 |
3 | 1 | 10 | 1 | 0 | 0 | 0 | 0 |
# DataFrame的loc和iloc方法可以选中行进行计算判断,loc和iloc分别通过索引和整数索引进行选择
for i in range(len(frame2_)):
if (frame2_.loc[i] !=0).sum() == 3:
frame2_.loc[i, '校验'] = '正确'
else:
frame2_.loc[i, '校验'] = '错误'
frame2_
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
A | B | C | D | E | F | G | 校验 | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 正确 |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 错误 |
2 | 1 | 0 | 1 | 0 | 2 | 0 | 0 | 错误 |
3 | 1 | 10 | 1 | 0 | 0 | 0 | 0 | 错误 |
3. 字段分列(带分隔符)
在数据源数据中,有时根据需要,需要从某一列数据中提取信息(比如从身份证号中提取出生年月信息)或者对数据进行分割(比如类似2011-01-05的日期,提取年月日信息单独成列)。根据数据的不同分为两种情况,利用字符串的分隔提取方法解决:
- 需要分列的信息之间有特殊的分隔符,比如逗号、空格等,可以直接用split方法分割;
- 没有特殊分隔符时,采用对字符串的索引方式,如 对x = ‘spam’;可以使用x[0],x[-1],x[1:3]等进行信息提取
本例是针对英文名进行分割,中间有空格作为分隔符
excel文件比较随意,只添加了数据内容,没有列名,先手动添加列名 name
frame3 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/字段分列.xls', 'Sheet1')
frame3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
name | |
---|---|
0 | Syed Abbas |
1 | Molly Dempsey |
2 | Lola Jacobsen |
3 | Diane Margheim |
# 首先提取需要分裂的列,用split()分列,显然,这里的分隔符为空格
frame3_ = pd.DataFrame((x.split(' ') for x in frame3.name), index = frame3.index, columns = ['A', 'B'])
frame3_
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
A | B | |
---|---|---|
0 | Syed | Abbas |
1 | Molly | Dempsey |
2 | Lola | Jacobsen |
3 | Diane | Margheim |
4. 字段分列(无特定分隔符)
frame4 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/数据抽取.xls', 'Sheet1')
frame4
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
姓名 | 姓 | |
---|---|---|
0 | 黄雅玲 | NaN |
1 | 王伟 | NaN |
2 | 谢丽秋 | NaN |
3 | 王俊元 | NaN |
4 | 孙林 | NaN |
5 | 王炫皓 | NaN |
6 | 张三丰 | NaN |
7 | 李四光 | NaN |
8 | 王麻子 | NaN |
9 | 赵六儿 | NaN |
# 字段本质上为字符串,固定的位置可以直接用索引直接选取
frame4['姓'] = pd.Series((x[0]) for x in frame4['姓名'])
frame4
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
姓名 | 姓 | |
---|---|---|
0 | 黄雅玲 | 黄 |
1 | 王伟 | 王 |
2 | 谢丽秋 | 谢 |
3 | 王俊元 | 王 |
4 | 孙林 | 孙 |
5 | 王炫皓 | 王 |
6 | 张三丰 | 张 |
7 | 李四光 | 李 |
8 | 王麻子 | 王 |
9 | 赵六儿 | 赵 |
5. 字段匹配
在excel中,vlookup是字段匹配搜索的神器,加上INDEX和MATCH函数几乎所向披靡。在DataFrame中,merge是合并两个DataFrame的方法,可以利用on = ‘列名’选择该列进行匹配,还可以选择选择交集、并集、左合并、右合并,功能十分强大
在本例中,员工职位表中有员工的姓名、工号、职务等信息,而在员工个人信息表中缺少职务信息,需要从员工职位表中将职务信息对应添加到员工个人信息表中。选择工号列进行匹配。
frame51 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/字符匹配/员工职位表.xlsx', 'Sheet1')
frame51
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
姓名 | 工号 | 部门 | 职务 | |
---|---|---|---|---|
0 | 黄雅玲 | A776477 | 销售部 | 销售代表 |
1 | 王伟 | A667708 | 销售部 | 销售代表 |
2 | 谢丽秋 | A520304 | 销售部 | 销售代表 |
3 | 王俊元 | A310882 | 销售部 | 销售总监 |
4 | 孙林 | A466074 | 销售部 | 销售代表 |
5 | 王炫皓 | A356517 | 销售部 | 销售代表 |
6 | 张三丰 | A277381 | 市场部 | 市场总监 |
7 | 李四光 | A254382 | 市场部 | 市场助理 |
8 | 王麻子 | A213541 | 市场部 | 市场助理 |
9 | 赵六儿 | A309752 | 市场部 | 市场助理 |
frame52 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/字符匹配/员工个人信息表(销售部).xlsx', 'Sheet1')
frame52
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
姓名 | 工号 | 出生年月 | 性别 | 工龄 | 职务 | |
---|---|---|---|---|---|---|
0 | 黄雅玲 | A776477 | 12/8/1968 | 女 | 37 | NaN |
1 | 王俊元 | A310882 | 2/19/1952 | 男 | 45 | NaN |
2 | 谢丽秋 | A520304 | 8/30/1963 | 女 | 28 | NaN |
3 | 王炫皓 | A356517 | 9/19/1958 | 男 | 33 | NaN |
4 | 孙林 | A466074 | 3/4/1955 | 男 | 29 | NaN |
5 | 王伟 | A667708 | 7/2/1963 | 男 | 8 | NaN |
# 需要从《员工职位表》中提取‘职务’信息到《员工个人信息表》中,这相当于两个DataFrame合并,连接键为‘工号’,需要的字段为职务
pd.merge(frame52, frame51[['工号', '职务']], on = '工号')
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
姓名 | 工号 | 出生年月 | 性别 | 工龄 | 职务_x | 职务_y | |
---|---|---|---|---|---|---|---|
0 | 黄雅玲 | A776477 | 12/8/1968 | 女 | 37 | NaN | 销售代表 |
1 | 王俊元 | A310882 | 2/19/1952 | 男 | 45 | NaN | 销售总监 |
2 | 谢丽秋 | A520304 | 8/30/1963 | 女 | 28 | NaN | 销售代表 |
3 | 王炫皓 | A356517 | 9/19/1958 | 男 | 33 | NaN | 销售代表 |
4 | 孙林 | A466074 | 3/4/1955 | 男 | 29 | NaN | 销售代表 |
5 | 王伟 | A667708 | 7/2/1963 | 男 | 8 | NaN | 销售代表 |
6. 简单计算
本质上相当于在DataFrame添加一列,该列由前面列的数据生成,直接两列相乘即可
本例中是计算销售额(运用公式:销售额 = 销售数量 * 单价)
frame6 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/简单计算.xls', 'Sheet1')
frame6
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
产品名称 | 销售数量 | 单价 | 销售额 | |
---|---|---|---|---|
0 | 产品A | 200.0 | 78.0 | NaN |
1 | 产品B | 300.0 | 88.0 | NaN |
2 | 产品C | 100.0 | 85.0 | NaN |
3 | 产品D | 50.0 | 100.0 | NaN |
4 | 产品E | 87.0 | 68.0 | NaN |
5 | 合计 | NaN | NaN | NaN |
frame6['销售额'] = frame6['销售数量'] * frame6['单价']
frame6
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
产品名称 | 销售数量 | 单价 | 销售额 | |
---|---|---|---|---|
0 | 产品A | 200.0 | 78.0 | 15600.0 |
1 | 产品B | 300.0 | 88.0 | 26400.0 |
2 | 产品C | 100.0 | 85.0 | 8500.0 |
3 | 产品D | 50.0 | 100.0 | 5000.0 |
4 | 产品E | 87.0 | 68.0 | 5916.0 |
5 | 合计 | NaN | NaN | NaN |
# 这里销售额已经计算完毕,因为看到表格中还有合计项,顺便联系一下iloc的用法
frame6.iloc[5, 1:] = frame6.iloc[0:5, 1:].sum()
frame6
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
产品名称 | 销售数量 | 单价 | 销售额 | |
---|---|---|---|---|
0 | 产品A | 200.0 | 78.0 | 15600.0 |
1 | 产品B | 300.0 | 88.0 | 26400.0 |
2 | 产品C | 100.0 | 85.0 | 8500.0 |
3 | 产品D | 50.0 | 100.0 | 5000.0 |
4 | 产品E | 87.0 | 68.0 | 5916.0 |
5 | 合计 | 737.0 | 419.0 | 61416.0 |
7. 函数计算
计算平均值和总和直接使用mean和sum函数,因为是计算每行的值,需要设置axis=1。
frame7 = pd.read_excel('H:/DataAnalysis/data/ch04/4.3/函数计算.xls', 'Sheet1')
frame7
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
产品名称 | 一季度 | 二季度 | 三季度 | 四季度 | 季度平均 | 总销售量 | |
---|---|---|---|---|---|---|---|
0 | 产品A | 51.00 | 40.8 | 56.100 | 91.80 | NaN | NaN |
1 | 产品B | 20.00 | 16.0 | 22.000 | 36.00 | NaN | NaN |
2 | 产品C | 154.00 | 123.2 | 169.400 | 277.20 | NaN | NaN |
3 | 产品D | 60.00 | 48.0 | 66.000 | 108.00 | NaN | NaN |
4 | 产品E | 96.00 | 76.8 | 105.600 | 172.80 | NaN | NaN |
5 | 产品F | 95.25 | 76.2 | 104.775 | 171.45 | NaN | NaN |
frame7['季度平均'] = frame7[['一季度', '二季度', '三季度', '四季度']].mean(axis = 1)
frame7['总销售量'] = frame7[['一季度','二季度','三季度','四季度']].sum(axis = 1)
frame7
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
产品名称 | 一季度 | 二季度 | 三季度 | 四季度 | 季度平均 | 总销售量 | |
---|---|---|---|---|---|---|---|
0 | 产品A | 51.00 | 40.8 | 56.100 | 91.80 | 59.92500 | 239.700 |
1 | 产品B | 20.00 | 16.0 | 22.000 | 36.00 | 23.50000 | 94.000 |
2 | 产品C | 154.00 | 123.2 | 169.400 | 277.20 | 180.95000 | 723.800 |
3 | 产品D | 60.00 | 48.0 | 66.000 | 108.00 | 70.50000 | 282.000 |
4 | 产品E | 96.00 | 76.8 | 105.600 | 172.80 | 112.80000 | 451.200 |
5 | 产品F | 95.25 | 76.2 | 104.775 | 171.45 | 111.91875 | 447.675 |
Python数据分析入门案例的更多相关文章
- Python数据分析入门
Python数据分析入门 最近,Analysis with Programming加入了Planet Python.作为该网站的首批特约博客,我这里来分享一下如何通过Python来开始数据分析.具体内 ...
- Python数据分析入门之pandas基础总结
Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...
- Python数据分析入门与实践 ✌✌
Python数据分析入门与实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 这是一个数据驱动的时代,想要从事机器学习.人工智能.数据挖掘等前沿技术,都离不开 ...
- Python数据分析入门与实践
Python数据分析入门与实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以关 ...
- python数据分析入门(一)----安装pandas
打算入坑, python数据分析 , 所以下载了 <利用python数据分析>的电子书, 影印版 , 14年出版的 , 现在有很多工具对不上号, 但是整体思想还是不变的 , 所以准备工作要 ...
- 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...
- python数据分析入门学习笔记
学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...
- python数据分析入门学习笔记儿
学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据 ...
- Python数据分析入门与实践 学习
pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程.pandas提供了快速,灵活和富有表现力的数据结构 ...
随机推荐
- windows+appium自动化,Desired Capabilities参数填写,查看界面信息
前言: 安装JDK并配置环境变量. 安装sdk并配置对应环境变量. 安装appium客户端. 手机打开开发者模式,并启用调试模式. 1.打开Appium客户端,点击Start Server V1.9. ...
- 如何让springboot打包的项目部署在阿里云上使用https和http方式访问
前言 问题描述:怎么让springboot部署在服务器上使用https协议方式访问我们的接口或者域名,目的是某些平台请求的是https协议,而不是https 部署环境:阿里云 centos7服务器,s ...
- cmd指令集
CMD指令集 win+R打开运行 输入命令 可以快速执行一些程序或者功能 cmd的指令通常在system中使用 在电脑的环境变量中path中添加环境变量 环境变量可以在cmd的黑窗口进行执行进行快速打 ...
- linux系统破解密码。
Linux系统Centos7及RedHat7破解密码 步骤如下: 1.开机之后按"e"键 2.找到以linux16的开头的行在行尾添加 rd.break console=tty0 ...
- k好数(动态规划)
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- 监听input实时输入
// 用Jquery实现: $('#input-element').on('input',()=>{ console.log("你按了一下111");}) // 用Jquer ...
- 解决ionic 中 $ionicHistory.goBack()无法返回
这种解决方法目前只适合用了 <ion-side-menus>这一组件的<ion-view> 解决方法: 在<ion-view>下一级中包一个div,如下图: 搞了几 ...
- EF-运行原理
一.什么是EF? 实体架构(Entity Framework)是微软以来ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句中解放出来. ...
- Linux shell脚本判断服务器网络是否可以上网
Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需要有个函数来判断服务器网络状态 我们可以通过curl来访问 www ...
- Gym 101510C
题意略. 思路: 由于xi的选取是任意的,所以我们不用去理会题目中的xi数列条件.主要是把关注点放在长度为L的线段覆盖至少k个整数这个条件上. 像这种取到最小的合法解的问题,我们应该要想到使用二分法来 ...