- 之前关于数据分析的学习是用到什么查阅什么,没有系统的学习过,最近通过这个机会,再复习下关于之前学过的数据分析的一些知识,并完善一些数据分析的方法.最近一系列的数据分析的内容来源于DataWhale开源.涉及到的数据集等可从github(https://github.com/datawhalechina/hands-on-data-analysis)上获取到.
复习:这门课程得主要目的是通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后,我们接下来我们要正式的开始数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。
这里有两份资料:
教材《Python for Data Analysis》和 baidu.com &
google.com(善用搜索引擎)
本节设计的知识
- 加载数据时 各级目录间是 / 或者 \\
- 可以通过os.getcwd()获取到该文件所在的绝对路径地址
- 加载数据时,可以通过 chunksize= 条件来逐块读取数据,也可以通过 nrows= 条件来读取数据的前多少行
- 加载csv数据默认是以’,‘分隔,加载tsv数据默认是’\t’分隔,可通过sep=’,'改变加载数据时的分隔方式
- 加载数据时,若数据中不含有列名那一行,要添加header=None条件,不然会将第一行数据作为列名
- 加载数据时,通过index_col=条件可以设置行索引,可以通过name=[]来设置行索引,通过header=0设置读取数据是不读取第一行数据
- 数据的观察 ; df.info() df.shape df.describe()等
- 数据的保存 : df.to_csv(“数据表名称”)
- 详情看目录
1 第一章:数据载入及初步观察
1.1 载入数据
数据集下载 https://www.kaggle.com/c/titanic/overview
1.1.1 任务一:导入numpy和pandas
#写入代码
import pandas as pd
import numpy as np
【提示】如果加载失败,学会如何在你的python环境下安装numpy和pandas这两个库
1.1.2 任务二:载入数据
(1) 使用相对路径载入数据
(2) 使用绝对路径载入数据
#写入代码
df = pd.read_csv("train.csv")
df.head(3)
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
df.shape
(891, 12)
#写入代码
df = pd.read_csv("F:\\10_DeepLearning\\tensorflow2.3\\学习学习\\hands-on-data-analysis-master\\hands-on-data-analysis-master\\第一单元项目集合\\train.csv")
df.head(3)
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下’.tsv’和’.csv’的不同,如何加载这两个数据集?
【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之前没有碰到的问题,要多多查资料吗,使用googel,了解业务逻辑,明白输入和输出是什么。
import os
os.getcwd()
'F:\\10_DeepLearning\\tensorflow2.3\\学习学习\\hands-on-data-analysis-master\\hands-on-data-analysis-master\\第一单元项目集合'
data = pd.read_table("train.csv")
data.head(3)
# 从打印结果可以看出,read_table默认是按照'\t'切分数据进行数据的加载,改成 ','即可
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked | |
---|---|
0 | 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/... |
1 | 2,1,1,"Cumings, Mrs. John Bradley (Florence Br... |
2 | 3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,S... |
data = pd.read_table("train.csv",sep=',')
data.head(3) # 在这里加上sep 就和csv的加载的结果一样了
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
- tsv : 默认是 '\t’进行数据分隔
- csv : 默认是 ','进行数据分隔
1.1.3 任务三:每1000行为一个数据模块,逐块读取
#写入代码
data = pd.read_csv("train.csv",chunksize=100)
data
<pandas.io.parsers.TextFileReader at 0x15249a1a308>
【思考】什么是逐块读取?为什么要逐块读取呢?
【提示】大家可以chunker(数据块)是什么类型?用for
循环打印出来出处具体的样子是什么?
- 逐块读取应该就是没获取到一个chunksize大小的数据后,就先将这部分数据读取到,如果数据没有读取完成,下次还是读取chunksize大小的数据
- 在数据过大的情况下,直接读取完整的数据,可能会因为内存不够无法完成读取,听过分块读取的方式可以使数据量很大的数据也能成功加载到.
for data_part in data:
print(data_part.shape)
(100, 12)
(100, 12)
(100, 12)
(100, 12)
(100, 12)
(100, 12)
(100, 12)
(100, 12)
(91, 12)
# 这种数据打印第一次时显示后,再次执行时就不显示了,好像是加载到一个地方被读取后就没了
# 这叫什么??
for data_part in data:
print(data_part.shape)
- 补充: 只想读取一部分数据时,可以设置nrows=* 来完成前nrows行数据的读取
data = pd.read_csv("train.csv",nrows=100)
data.shape
(100, 12)
1.1.4 任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
#写入代码
# 方法1 : 在加载数据的时候设置names从而达到修改列名的目的,如下所示 -> 方法2 : 读取后修改列名 : 看下面的思考
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID')
df.head(3)
是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | NaN | S |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
- 注意: 如果不添加header=0,由于第一列数据是英文列名,所以会显示出来
- 此外,若数据中没有列名这一行数据,加载数据是需要设置 header=None,不然会将第一行数据作为列名
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head(3)
是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
【思考】所谓将表头改为中文其中一个思路是:将英文列名表头替换成中文。还有其他的方法吗?
# [思考回答]
# 1. 上述的方法是在加载数据的时候,直接修改列名
# 2. 还可以在加载数据完成后修改列名
df = pd.read_csv("train.csv")
df.columns=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口']
df.head(3)
乘客ID | 是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
# [思考回答]
# 方法3 : 应该有这种方式 : 在读取数据的时候,通过字典中对cloumns的键值对来设置修改应为列名为中文列名
# [补充]
# 还可以通过 df.rename(columns={'原列名':'新列名'},inplace=True)的方式修改某个列的列名
df = pd.read_csv("train.csv")
df.rename(columns={'PassengerId':'乘客ID','Age':'年龄'},inplace=True) # 必须加上inplace=True,表示在原表上修改
df.head(3)
乘客ID | Survived | Pclass | Name | Sex | 年龄 | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
1.2 初步观察
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等
1.2.1 任务一:查看数据的基本信息
#写入代码
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID')
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 892 entries, PassengerId to 891
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 是否幸存 892 non-null object
1 仓位等级 892 non-null object
2 姓名 892 non-null object
3 性别 892 non-null object
4 年龄 715 non-null object
5 兄弟姐妹个数 892 non-null object
6 父母子女个数 892 non-null object
7 船票信息 892 non-null object
8 票价 892 non-null object
9 客舱 205 non-null object
10 登船港口 890 non-null object
dtypes: object(11)
memory usage: 83.6+ KB
【提示】有多个函数可以这样做,你可以做一下总结
1.2.2 任务二:观察表格前10行的数据和后15行的数据
#写入代码
# 同时加载前10行数据和后15行数据
df.head(10).append(df.tail(15))
是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | NaN | S |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | NaN | S |
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.05 | NaN | S |
6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54 | 0 | 0 | 17463 | 51.8625 | E46 | S |
8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2 | 3 | 1 | 349909 | 21.075 | NaN | S |
9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27 | 0 | 2 | 347742 | 11.1333 | NaN | S |
877 | 0 | 3 | Gustafsson, Mr. Alfred Ossian | male | 20 | 0 | 0 | 7534 | 9.8458 | NaN | S |
878 | 0 | 3 | Petroff, Mr. Nedelio | male | 19 | 0 | 0 | 349212 | 7.8958 | NaN | S |
879 | 0 | 3 | Laleff, Mr. Kristo | male | NaN | 0 | 0 | 349217 | 7.8958 | NaN | S |
880 | 1 | 1 | Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) | female | 56 | 0 | 1 | 11767 | 83.1583 | C50 | C |
881 | 1 | 2 | Shelley, Mrs. William (Imanita Parrish Hall) | female | 25 | 0 | 1 | 230433 | 26 | NaN | S |
882 | 0 | 3 | Markun, Mr. Johann | male | 33 | 0 | 0 | 349257 | 7.8958 | NaN | S |
883 | 0 | 3 | Dahlberg, Miss. Gerda Ulrika | female | 22 | 0 | 0 | 7552 | 10.5167 | NaN | S |
884 | 0 | 2 | Banfield, Mr. Frederick James | male | 28 | 0 | 0 | C.A./SOTON 34068 | 10.5 | NaN | S |
885 | 0 | 3 | Sutehall, Mr. Henry Jr | male | 25 | 0 | 0 | SOTON/OQ 392076 | 7.05 | NaN | S |
886 | 0 | 3 | Rice, Mrs. William (Margaret Norton) | female | 39 | 0 | 5 | 382652 | 29.125 | NaN | Q |
887 | 0 | 2 | Montvila, Rev. Juozas | male | 27 | 0 | 0 | 211536 | 13 | NaN | S |
888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19 | 0 | 0 | 112053 | 30 | B42 | S |
889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.45 | NaN | S |
890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26 | 0 | 0 | 111369 | 30 | C148 | C |
891 | 0 | 3 | Dooley, Mr. Patrick | male | 32 | 0 | 0 | 370376 | 7.75 | NaN | Q |
1.2.4 任务三:判断数据是否为空,为空的地方返回True,其余地方返回False
#写入代码
df.isnull()
是否幸存 | 仓位等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹个数 | 父母子女个数 | 船票信息 | 票价 | 客舱 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
PassengerId | False | False | False | False | False | False | False | False | False | False | False |
1 | False | False | False | False | False | False | False | False | False | True | False |
2 | False | False | False | False | False | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False | False | True | False |
4 | False | False | False | False | False | False | False | False | False | False | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
887 | False | False | False | False | False | False | False | False | False | True | False |
888 | False | False | False | False | False | False | False | False | False | False | False |
889 | False | False | False | False | True | False | False | False | False | True | False |
890 | False | False | False | False | False | False | False | False | False | False | False |
891 | False | False | False | False | False | False | False | False | False | True | False |
892 rows × 11 columns
【总结】上面的操作都是数据分析中对于数据本身的观察
【思考】对于一个数据,还可以从哪些方面来观察?找找答案,这个将对下面的数据分析有很大的帮助
# [思考回答]
# 1.可以查看数据的df.describe()观察数值型数据的分布特征
# 2.可以查看下类别型特征中有几个类别,他们和最终的label大概有什么关系
1.3 保存数据
1.3.1 任务一:将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#写入代码
# 注意:不同的操作系统保存下来可能会有乱码。大家可以加入`encoding='GBK' 或者 ’encoding = ’uft-8‘‘`
df.to_csv("train_chinese.csv")
【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和pandas在工作和项目场景的运用。
第一章第一节涉及的点
- 加载数据时 各级目录间是 / 或者 \\
- 可以通过os.getcwd()获取到该文件所在的绝对路径地址
- 加载数据时,可以通过 chunksize= 条件来逐块读取数据,也可以通过 nrows= 条件来读取数据的前多少行
- 加载csv数据默认是以’,‘分隔,加载tsv数据默认是’\t’分隔,可通过sep=’,'改变加载数据时的分隔方式
- 加载数据时,若数据中不含有列名那一行,要添加header=None条件,不然会将第一行数据作为列名
- 加载数据时,通过index_col=条件可以设置行索引,可以通过name=[]来设置行索引,通过header=0设置读取数据是不读取第一行数据
- 数据的观察 ; df.info() df.shape df.describe()等
- 数据的保存 : df.to_csv(“数据表名称”)