Datawhale组队学习 2022年1月 动手学数据分析 第1章

第一章:数据载入及初步观察

1.1 载入数据

数据集下载 https://www.kaggle.com/c/titanic/overview。

下载好以后把train.csv文件复制几份,使用excel,分别把格式另存为成为tsvxlsx,全都放到ipynb文件所在文件夹下。

1.1.0 安装numpy和pandas

以管理员身份打开命令行,根据实际情况输入下面两条指令中的一条即可。

#没安装Anaconda,一般都没安装
pip install numpy pandas

#已经安装了Anaconda
conda install numpy pandas

有时候会出现网络问题,这时需要手动将pip或Anaconda的仓库地址修改到国内:Anaconda换源方法pip换源方法,然后重新执行上面的指令。

1.1.1 任务一:导入numpy和pandas

以下代码运行环境均为jupyter notebook

import numpy as npy # 现实里没有npy,在这里弥补一下
import pandas as pd
import os #这个作用不大,只在查看当前路径时用到过一次

1.1.2 任务二:载入数据

【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。

  1. 使用相对路径载入数据
pd.read_csv("train.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
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
886 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.0000 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns


  1. 使用绝对路径载入数据
pd.options.display.max_rows=2#让pandas每次只展示头尾共2行数据,看着更清爽一点
print(os.getcwd())
pd.read_csv("d:/myData/Datawhale/202201-DataAnalysis/第一单元项目集合/train.csv")

运行结果:

D:\myData\Datawhale\202201-DataAnalysis\第一单元项目集合

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
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns


【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下'.tsv'和'.csv'的不同,如何加载这两个数据集?

下面尝试使用pd.read_csv读取tsv文件:

pd.read_csv('train.tsv')

运行结果:

PassengerId\tSurvived\tPclass\tName\tSex\tAge\tSibSp\tParch\tTicket\tFare\tCabin\tEmbarked
0 1\t0\t3\t"Braund\t Mr. Owen Harris"\tmale\t22...
... ...
890 891\t0\t3\t"Dooley\t Mr. Patrick"\tmale\t32\t0...

891 rows × 1 columns


尝试用pd.read_table读取csv文件:

pd.read_table('train.csv')

运行结果:

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/...
... ...
890 891,0,3,"Dooley, Mr. Patrick",male,32,0,0,3703...

891 rows × 1 columns


由于文件中的分隔符与被调用方法的默认分隔符不同,文件被认为只有一个字段。

解决方法:通过sep参数设置分隔符,这可以让pd.read_csvpd.read_table表现一致。

pd.read_table('train.csv',sep=',')

运行结果:

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
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns


pd.read_csv('train.tsv',sep='\t')

运行结果:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund\t Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley\t Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns


如上面两段代码执行结果所示,指定sep参数后,pandas能正确读取数据文件。

另外通过查阅资料发现,sep参数还支持正则表达式,可以用来处理更复杂混乱的数据文件。

使用pd.read_excel还可以读取Excel的xlsxxls文件:

pd.read_excel('train.xlsx')

运行结果:

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
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 12 columns


【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(eg:.csv.tsv.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之前没有碰到的问题,要多多查资料吗,使用google,了解业务逻辑,明白输入和输出是什么。

1.1.3 任务三:每1000行为一个数据模块,逐块读取

【思考】什么是逐块读取?为什么要逐块读取呢?

【提示】大家可以chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?

如果指定了chunksize参数,pd.read_csvpd.read_table会返回一个迭代器,该迭代器迭代时,每次读取文件的最多chunksize行(最后一次读取可能不够chunksize行)。

每次读取到的部分以DataFrame类型返回,遍历过程总共会返回\(\lceil \frac{n}{chunksize}\rceil\)个DataFrame,其中n是数据的总行数。

逐块读取可以用来读取大文件,防止将文件一次性读入,因为内存占用过多产生各种问题。

chunker=pd.read_csv('train.csv',chunksize=1000)
ar=[]
for i in chunker:#遍历chunker
    ar.append(i)#将每个小块放入数组ar中
ar[0]#查看第一个小块的内容

运行结果:

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.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 12 columns


1.1.4 任务四:将表头改成中文,索引改为乘客ID

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

对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据,对于当前的泰坦尼克数据集:

PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口

这两个任务都有两种实现方式:

  1. 在读取是通过指定read_csv的参数来实现;
  2. 读取完成后调用DataFrame对象提供的方法来实现。

读取时修改字段名:read_csv函数的names参数可以接受一个List类型的对象,List对象中的字符串数量必须和原始数据中的字段数量一致,最终返回的DataFrame对象字段名依次为List中的字符串。这个方法在原始数据字段名大部分需要更改时比较方便。

读取时指定索引:read_csv函数的index_col参数可以接受一个字符串或一个由字符串组成的List对象,表示要将索引设置为该参数指定的某列或某几列。

代码如下:

newNamesList=[
    '乘客ID',
    '是否幸存',
    '乘客等级(1/2/3等舱位)',
    '乘客姓名',
    '性别',
    '年龄',
    '堂兄弟/妹个数',
    '父母与小孩个数',
    '船票信息',
    '票价',
    '客舱',
    '登船港口',
]
pd.read_csv('train.csv',names=newNamesList,header=0,index_col='乘客ID')

运行结果:

是否幸存 乘客等级(1/2/3等舱位) 乘客姓名 性别 年龄 堂兄弟/妹个数 父母与小孩个数 船票信息 票价 客舱 登船港口
乘客ID
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ...
891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 11 columns


读取完毕再修改DataFrame对象的字段名有两个途径:

  1. 使用DataFrame对象的rename方法,其中的columns参数接受一个“可调用对象”,例如函数、字典等,该对象需要实现旧字段名到新字段名的映射,在原始数据字段名只有少部分需要修改时更方便。
  2. 直接修改DataFrame对象的columns属性,将其赋值为一个List,类似read_csv函数的names参数,用List对象中的字符串依次给各个字段重命名,List对象中的字符串数量必须和原始数据中的字段数量一致,在原始数据字段名大部分需要更改时比较方便。

想读取完毕再指定或修改DataFrame对象的索引,可以用set_index方法,其中的keys参数类似read_csv函数的index_col参数,可以接受一个字符串或一个由字符串组成的List对象,表示要将索引设置为某列或某几列。

代码演示如下:

newNamesDict={
    'PassengerId':'乘客ID',
    'Survived':'是否幸存',
    'Pclass':'乘客等级(1/2/3等舱位)',
    'Name':'乘客姓名',
    'Sex':'性别',
    'Age':'年龄',
    'SibSp':'堂兄弟/妹个数',
    'Parch':'父母与小孩个数',
    'Ticket':'船票信息',
    'Fare':'票价',
    'Cabin':'客舱',
    'Embarked':'登船港口',
}
df=pd.read_csv('train.csv')
df.rename(columns=a,inplace=True)#原地修改,不需要赋值回去
df=df.set_index(keys='乘客ID')#需要赋值回去
df

运行结果(下沉的字段表示当前索引):

Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
乘客ID
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ...
891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 11 columns


上一篇:CentOS 7.6+mysql5.7 设置mysql开机自启动


下一篇:群晖虚拟机VMM定时开启