ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-14 13:57:25  阅读:181  来源: 互联网

标签:数据分析 df data 第一节 载入 Mr csv 数据 加载


  • 之前关于数据分析的学习是用到什么查阅什么,没有系统的学习过,最近通过这个机会,再复习下关于之前学过的数据分析的一些知识,并完善一些数据分析的方法.最近一系列的数据分析的内容来源于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)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
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)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS

【提示】相对路径载入报错时,尝试使用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
01,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/...
12,1,1,"Cumings, Mrs. John Bradley (Florence Br...
23,1,3,"Heikkinen, Miss. Laina",female,26,0,0,S...
data = pd.read_table("train.csv",sep=',')
data.head(3) # 在这里加上sep 就和csv的加载的结果一样了
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
  • 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
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
103Braund, Mr. Owen Harrismale2210A/5 211717.25NaNS
211Cumings, Mrs. John Bradley (Florence Briggs Th...female3810PC 1759971.2833C85C
  • 注意: 如果不添加header=0,由于第一列数据是英文列名,所以会显示出来
  • 此外,若数据中没有列名这一行数据,加载数据是需要设置 header=None,不然会将第一行数据作为列名
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head(3)
是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
乘客ID
103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS

【思考】所谓将表头改为中文其中一个思路是:将英文列名表头替换成中文。还有其他的方法吗?

# [思考回答]

# 1. 上述的方法是在加载数据的时候,直接修改列名
# 2. 还可以在加载数据完成后修改列名 
df = pd.read_csv("train.csv")
df.columns=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口']
df.head(3)
乘客ID是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
# [思考回答]

# 方法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)
乘客IDSurvivedPclassNameSex年龄SibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS

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
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
103Braund, Mr. Owen Harrismale2210A/5 211717.25NaNS
211Cumings, Mrs. John Bradley (Florence Briggs Th...female3810PC 1759971.2833C85C
313Heikkinen, Miss. Lainafemale2600STON/O2. 31012827.925NaNS
411Futrelle, Mrs. Jacques Heath (Lily May Peel)female351011380353.1C123S
503Allen, Mr. William Henrymale35003734508.05NaNS
603Moran, Mr. JamesmaleNaN003308778.4583NaNQ
701McCarthy, Mr. Timothy Jmale54001746351.8625E46S
803Palsson, Master. Gosta Leonardmale23134990921.075NaNS
913Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)female270234774211.1333NaNS
87703Gustafsson, Mr. Alfred Ossianmale200075349.8458NaNS
87803Petroff, Mr. Nedeliomale19003492127.8958NaNS
87903Laleff, Mr. KristomaleNaN003492177.8958NaNS
88011Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)female56011176783.1583C50C
88112Shelley, Mrs. William (Imanita Parrish Hall)female250123043326NaNS
88203Markun, Mr. Johannmale33003492577.8958NaNS
88303Dahlberg, Miss. Gerda Ulrikafemale2200755210.5167NaNS
88402Banfield, Mr. Frederick Jamesmale2800C.A./SOTON 3406810.5NaNS
88503Sutehall, Mr. Henry Jrmale2500SOTON/OQ 3920767.05NaNS
88603Rice, Mrs. William (Margaret Norton)female390538265229.125NaNQ
88702Montvila, Rev. Juozasmale270021153613NaNS
88811Graham, Miss. Margaret Edithfemale190011205330B42S
88903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.45NaNS
89011Behr, Mr. Karl Howellmale260011136930C148C
89103Dooley, Mr. Patrickmale32003703767.75NaNQ

1.2.4 任务三:判断数据是否为空,为空的地方返回True,其余地方返回False

#写入代码

df.isnull()
是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
乘客ID
PassengerIdFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
....................................
887FalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
888FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
889FalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalse
890FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
891FalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse

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(“数据表名称”)

标签:数据分析,df,data,第一节,载入,Mr,csv,数据,加载
来源: https://blog.csdn.net/DDxuexi/article/details/117902552

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有