转载自 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的日期,提取年月日信息单独成列)。根据数据的不同分为两种情况,利用字符串的分隔提取方法解决:

  1. 需要分列的信息之间有特殊的分隔符,比如逗号、空格等,可以直接用split方法分割;
  2. 没有特殊分隔符时,采用对字符串的索引方式,如 对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数据分析入门案例的更多相关文章

  1. Python数据分析入门

    Python数据分析入门 最近,Analysis with Programming加入了Planet Python.作为该网站的首批特约博客,我这里来分享一下如何通过Python来开始数据分析.具体内 ...

  2. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...

  3. Python数据分析入门与实践 ✌✌

    Python数据分析入门与实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 这是一个数据驱动的时代,想要从事机器学习.人工智能.数据挖掘等前沿技术,都离不开 ...

  4. Python数据分析入门与实践

    Python数据分析入门与实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以关 ...

  5. python数据分析入门(一)----安装pandas

    打算入坑, python数据分析 , 所以下载了 <利用python数据分析>的电子书, 影印版 , 14年出版的 , 现在有很多工具对不上号, 但是整体思想还是不变的 , 所以准备工作要 ...

  6. 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  7. python数据分析入门学习笔记

    学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...

  8. python数据分析入门学习笔记儿

    学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据 ...

  9. Python数据分析入门与实践 学习

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程.pandas提供了快速,灵活和富有表现力的数据结构 ...

随机推荐

  1. React 现代化测试

    测试的动机 测试用例的书写是一个风险驱动的行为, 每当收到 Bug 报告时, 先写一个单元测试来暴露这个 Bug, 在日后的代码提交中, 若该测试用例是通过的, 开发者就能更为自信地确保程序不会再次出 ...

  2. activemq的下载与安装

    一.介绍 Apache ActiveMQ™是最流行的开源,多协议,基于Java的消息服务器.它支持行业标准协议,因此用户可以通过广泛的语言和平台获得客户选择的好处.可以使用C,C ++,Python, ...

  3. Java 从入门到进阶之路(三)

    之前的文章我们介绍了 Java 中的变量和基本数据类型,本章我们来看一下 Java 的运算符和表达式. 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操 ...

  4. python学习——python之禅

    (一)python之禅: 在python中运行import this你会看到这样一段文字: The Zen of Python, by Tim Peters   Beautiful is better ...

  5. 【原创】Linux cpuidle framework

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. [SNOI2019]字符串

    名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...

  7. SPOJ - Find The Determinant III 计算矩阵的行列式答案 + 辗转相除法思想

    SPOJ -Find The Determinant III 参考:https://blog.csdn.net/zhoufenqin/article/details/7779707 参考中还有几个关于 ...

  8. 【Offer】[67] 【把字符串转换成整数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能 ...

  9. bzoj2141_排队

    题意 给定\(n\)个数,每次交换两个数,输出交换后的逆序数. 分析 交换两个数只会影响到对应区间内的逆序数,具体为减少区间\([l+1,r-1]\)中比\(a[r]\)大的数的个数,增加比\(a[r ...

  10. Oracle 11g Rac 用rman实现把本地数据文件迁移到ASM共享存储中

    在Oracle Rac环境中,数据文件都是要存放在ASM共享存储上的,这样两个节点才能同时访问.而当你在某一节点下把数据文件创建在本地磁盘的时候,那么在另一节点上要访问该数据文件的时候就会报错,因为找 ...