动手学数据分析_第一章:第一节:数据载入及初步观察

  • 之前关于数据分析的学习是用到什么查阅什么,没有系统的学习过,最近通过这个机会,再复习下关于之前学过的数据分析的一些知识,并完善一些数据分析的方法.最近一系列的数据分析的内容来源于DataWhale开源.涉及到的数据集等可从github(https://github.com/datawhalechina/hands-on-data-analysis)上获取到.

复习:这门课程得主要目的是通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后,我们接下来我们要正式的开始数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。
这里有两份资料:
教材《Python for Data Analysis》和 baidu.com &
google.com(善用搜索引擎)

本节设计的知识

  1. 加载数据时 各级目录间是 / 或者 \\
  2. 可以通过os.getcwd()获取到该文件所在的绝对路径地址
  3. 加载数据时,可以通过 chunksize= 条件来逐块读取数据,也可以通过 nrows= 条件来读取数据的前多少行
  4. 加载csv数据默认是以’,‘分隔,加载tsv数据默认是’\t’分隔,可通过sep=’,'改变加载数据时的分隔方式
  5. 加载数据时,若数据中不含有列名那一行,要添加header=None条件,不然会将第一行数据作为列名
  6. 加载数据时,通过index_col=条件可以设置行索引,可以通过name=[]来设置行索引,通过header=0设置读取数据是不读取第一行数据
  7. 数据的观察 ; df.info() df.shape df.describe()等
  8. 数据的保存 : df.to_csv(“数据表名称”)
  9. 详情看目录

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在工作和项目场景的运用。

第一章第一节涉及的点

  1. 加载数据时 各级目录间是 / 或者 \\
  2. 可以通过os.getcwd()获取到该文件所在的绝对路径地址
  3. 加载数据时,可以通过 chunksize= 条件来逐块读取数据,也可以通过 nrows= 条件来读取数据的前多少行
  4. 加载csv数据默认是以’,‘分隔,加载tsv数据默认是’\t’分隔,可通过sep=’,'改变加载数据时的分隔方式
  5. 加载数据时,若数据中不含有列名那一行,要添加header=None条件,不然会将第一行数据作为列名
  6. 加载数据时,通过index_col=条件可以设置行索引,可以通过name=[]来设置行索引,通过header=0设置读取数据是不读取第一行数据
  7. 数据的观察 ; df.info() df.shape df.describe()等
  8. 数据的保存 : df.to_csv(“数据表名称”)

上一篇:大数据入门--hadoop(三)--MR编程


下一篇:Windows上写MR程序小问题