一、 通过apply来调用方法,以预处理数据
1.1 通过apply,调用系统自带方法,批量改变大小写
从已有的csv文件中,获取到数据,用DataFrame盛放;
查看下前五列;
查看下尺寸大小:5行
2.
通过apply方法,来批量的改变DataFrame中的一列(/行)
- 创建一个新的Series:元素是5个‘a’
- 将A这一列的所有元素改为大写
1.2 通过apply,调用自定义方法,进行复杂操作(拆分列)
上述的批量改动,用到是系统自带的方法。
但是,如果需求是将一列改为三列,就没有现成的方法了。那怎么办呢?
1.
2.
通过自己编写一个方法来操作:
3.
4.
通过combine来结合(填充):
删掉两个多余的列:
5.将其存储为一个csv文件,方便后续的使用
二、通过去重,进行数据清洗
2.1 代码实践
- 数据准备
- 查看是否有重复:False:代表跟前面无重复;True:代表跟前面有重复
- 对Seqno这一列,将重复的元素及其所在的行,删除掉。(默认,保留的是第一个非重复元素及其所在的行)
- keep='last':表示只想保留最后那一个元素及其所在的行
duplicate:
repeat or copy
三、时间序列基础:作为index来组成一个Series
3.1 方式1:用datetime专库,来生成一个datetime类型的时间序列对象
在python中,处理时间经常会使用一个库:datetime库。
1.
创建一个datetime对象:
2.
创建一个Series,它的index就是上述列表中的datetime对象。发现:
- 其values是numpy里的array数组
- 其index是一个DatetimeIndex的对象
3.2 三种访问方式
1.
通过位置来访问
通过一个datetime对象来访问
直接通过具体的时间来访问
2.
如果只写年份,不写月日呢?那么就会返回对应范围内的所有数据:
3.3 方式2:用Pandas大库来快速生成一段时间范围
1.
- periods:产生多少个时间对象
- freq:时间对象的单位,默认是天D
2.
也可以产生100个周:
指定每周的起点是周一:
同理,也可以单位是小时:
3.上面的是包含多个datetime对象的list列表,可作为index。那么,下面就用它来生成一个Series:
四、时间序列数据的采样和画图
4.1 重新采样:调整采样频率
1.
创建一个时间序列:用Pandas库来生成一个范围的时间段t_range:
创建一个Series,将上述t_range作为index:
2.重新采样:频率高的--- > 频率低的
上述是一天一个数据,怎么才能实现一月一个数据呢?
3.重新采样:频率低的--- > 频率高的
上述是一天一个数据,怎么才能实现一小时一个数据呢?
其中:填充方式是:
- ffill:forward fill
- bfill:backward fill
4.2 画图:时序图
时间序列的数据,特别适合画图。
1.首次采样
图为:
2.重新采样:
让其从每小时的频率,变为每周的频率,即,将采样频率降低:
五、数据分箱技术 Binning
5.1 本质:分级分段
1.生活例子
超市中,相同品种的苹果,会根据不同的大小尺寸,来卖出不同的价格。
即,用下述的圆圈来对苹果进行分级。
2.
用Numpy库,来生成一个数组:包含20个随机整数,作为学生的成绩:
对上述的20个学生成绩,进行分级(分箱):
- 先定义一个bins,即用来分级分段的“小圈圈”。
- 看看上述的20个成绩,分别落在bins的数量。返回的是一个Categories对象
- 查看下每个分段中,各有多少个人
5.2 对DataFrame的某一列column,来分级分段:20个学生成绩,划分分数段
其实,也可以对DataFrame的某一列column,进行分级分段:
1.
pandas库来生成学生一列:随机的三个字母或数字
包含for循环的列表表达式?
2.
将DataFrame的score一列,进行分箱分段,生成一个category对象:
将上述的category对象,赋值给DataFrame的一个新增列:
3.
上述的分箱还是不太明显。
可以对上述分级的箱子,贴个好懂直观的标签labels:
出错:old version:
new version:
借鉴:
六、数据分组技术 GroupBy
跟数据库中的GroupBy分组,原理一致。比如:
6.1 代码实践
1.
本地电脑中的csv文件:
新建一个csv文件时,最好是先一个text文本格式,然后改文件扩展名为csv。
如果先是excel格式,再改扩展名,那么pandas会读不出来、出错。
2.
读取为一个DateFrame:
对某一列进行分组,生成一个分组对象
该分组对象中,看下城市为BJ的情况:
并求平均值:
解决:
链接
https://stackoverflow.com/questions/44522741/pandas-typeerror-could-not-convert-to-numeric
3.
6.2 原理(图)
先分割,再调用函数(比如求平均),最后重组
6.3 将groupby对象,转换为list列表、dict字典
1.
2.
七、数据聚合技术 Aggregation
aggregation:
the act of gathering something together
= collection
7.1 使用自定义函数来聚合
1.
聚合函数,可以是系统自带的。比如,最大值、最小值:
聚合函数,也可以是,自定义的函数:
7.2 按照多个列column来groupby
1.
groupby:不是非得一个列column,也可以多个列
注意:下划线是一个元组tuple:
查看一下子的分组:
2.
还是用for循环,去访问groupby对象中的数据,看一下:
此时,tuple里有两个元素
八、透视表
概念,来源于Excel。
为了更好的展示数据,而制作的一种临时表。
这不就是数据库MySQL中的视图吗
8.1 函数中各参数的含义pd.pivot_table()
1.
本地电脑中的excel数据:销售表
2.
3.函数的解释
其中:
8.2 各参数的代码实践
需要对数据之间的关系,有一定的了解.
1.
index、values两个参数:
调整下聚合函数为求和:
2.
也可以是多个index:
3.
4.
需求:每个销售代表人员,的销售业绩是多少?
5.
上述的values参数、columns参数容易混淆:
columns:还是分列的作用
values:就是各个数值都是这个性质
九、实战:分组和透视功能
9.1 数据准备
1.
538网站,用于查看航班的准点率
链接:https://projects.fivethirtyeight.com/flights/
2.
本地电脑中的数据:
3.
谷歌浏览器,根据表名找了好久,这次没找到原表。
又根据慕课课程名,找到了以前学生的笔记及其存放课堂的数据集的github链接。
9.2 task1:获取延误时间最长top10
1.
判断一个航班是否延误的标准:
就是只看arr_delay到达时间的字段,是否为负。
- 正数:延误了多长时间。
- 负数:没有延误。
2.
对arr_delay字段,进行递减排序;
拿出前十名,看下;
9.3 task2:计算延误和没有延误所占比例
1.
20万条数据中,有多少是取消的、没有取消的:
2.
生成新的一列,用bool值来体现;(因为所需函数比较简单,所以使用lambda表示即可)
- 没有延误:十万多个
- 延误的:九万多个
在数据分析领域:
用计算机这一”神算子“就是好,这么快就的数数。
3.
延误比:
9.4 task3:每一个航空公司延误的情况
本质:分组。
1.
生成一个groupby对象;
查看下里面的情况;生成的是一个多级的Series:
2.
9.5 task4:画图:plot()
plot:secret plan。
1.
2.
上图不是很直观,所以接下来换个类型
9.6 task5:透视表:pivot_table()
pivot:中心、轴、枢纽。
Comments | NOTHING