Datawhale---动手学数据分析---第一章:数据载入及初步观察(泰坦尼克的任务)

1.1 载入数据

数据集下载 Titanic - Machine Learning from Disaster | Kaggle

1.1.1 任务一:导入numpy和pandas

import numpy as np
import pandas as pd

1.1.2 任务二:载入数据

(1) 使用相对路径载入数据

pd.read_csv('train.csv')


(2) 使用绝对路径载入数据 

import os
path = os.path.abspath('train.csv')
pd.read_csv(path)

【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下'.tsv'和'.csv'的不同,如何加载这两个数据集?

注意:read_csv和read_table都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,

但是read_csv是以‘,’为标志,而read_table是以制表符 \t 作为数据的标志,也就是以行为单位进

行存储。

pd.read_table(path)

 所以把read_table的分隔符改为‘,’就可以变得和read_csv一样了

pd.read_table(path,sep = ',')


【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式

(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之

前没有碰到的问题,要多多查资料吗,使用googel,了解业务逻辑,明白输入和输出是什么。

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

方法一:调用get_chunk()函数

df = pd.read_csv(path,chunksize = 1000)
df.get_chunk()

方法二:用for循环

df = pd.read_csv(path,chunksize = 1000)
for chunker in df:
    print(chunker)

  这里因为是print打印出来的,所以看起来很丑(只能4列4列地打印)

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

逐块读取就是将文本分成若干块。因为我们平时使用pandas来处理文件的时候,经常会遇到大文

件,但有时候我们只想要读取其中的一部分数据或对文件进行逐块处理。

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

 chunker(数据块)的类型:TextFileReader

for循环打印出来的样子是:<pandas.io.parsers.readers.TextFileReader at

0x19569050a00>

1.1.4 任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]

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

方法一:直接修改(即重命名,所以要一一对应,在想要单独修改时,不推荐)

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

方法二:调用rename()函数(​在columns后面是一个字典形式,键是原列名,值是新列名。修改的时候只会改选择到的列。只有加上inplace = True,才会生效)

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

 1.2 初步观察

导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都

是什么格式的,是否包含null等

1.2.1 任务一:查看数据的基本信息

df.info():                        # 打印摘要
df.describe():                    # 描述性统计信息
df.values:                        # 数据 <ndarray>
df.to_numpy()                     # 数据 <ndarray> (推荐)
df.shape:                         # 形状 (行数, 列数)
df.columns:                       # 列标签 <Index>
df.columns.values:                # 列标签 <ndarray>
df.index:                         # 行标签 <Index>
df.index.values:                  # 行标签 <ndarray>
df.head(n):                       # 前n行
df.tail(n):                       # 尾n行
pd.options.display.max_columns=n: # 最多显示n列
pd.options.display.max_rows=n:    # 最多显示n行
df.memory_usage():                # 占用内存(字节B)

内容很多,不求一下子全记住,但是要知道有这么一回事,熟能生巧,以后用多了就记住了

1.2.2 任务二:观察表格前10行的数据和后15行的数据

df.head(10)

df.tail(15)

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

df.isnull()

 【总结】上面的操作都是数据分析中对于数据本身的观察

【思考】对于一个数据,还可以从哪些方面来观察?找找答案,这个将对下面的数据分析有很大的帮助

df.info():                        # 打印摘要
df.describe():                    # 描述性统计信息
df.values:                        # 数据 <ndarray>
df.to_numpy()                     # 数据 <ndarray> (推荐)
df.shape:                         # 形状 (行数, 列数)
df.columns:                       # 列标签 <Index>
df.columns.values:                # 列标签 <ndarray>
df.index:                         # 行标签 <Index>
df.index.values:                  # 行标签 <ndarray>
df.head(n):                       # 前n行
df.tail(n):                       # 尾n行
pd.options.display.max_columns=n: # 最多显示n列
pd.options.display.max_rows=n:    # 最多显示n行
df.memory_usage():                # 占用内存(字节B)

1.3 保存数据

1.3.1 任务一:将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv

df.to_csv('train_chinese.csv')

 【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和

pandas在工作和项目场景的运用。

1.4 知道你的数据叫什么

我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?

pandas中有两个数据类型Dateframe和Series

Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数

据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以

重复的。

DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字

符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

开始前导入numpy和pandas

import numpy as np
import pandas as pd

1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子[开放题]

s = pd.Series([1, 2, 3, 4, 5])  
s  

s = {'A': [1, 2, 3, 4, 5],'B': [6, 7, 8, 9, 10]}
s1 = pd.DataFrame(s)
s1

 

1.4.2 任务二:根据上节课的方法载入"train.csv"文件

df = pd.read_csv('train.csv')
df

 1.4.3 任务三:查看DataFrame数据的每列的名称

df.columns

 1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]

#方法一
df.Cabin
#方法二
df['Cabin']

上述两种方法的输出类型皆是Series,若想转成DateFrame类型则用下面这种方法

df[['Cabin']]

 

 1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除

df = pd.read_csv('test_1.csv')
df

 经过我们的观察发现一个测试集test_1.csv有两列是多余的,我们需要将这个多余的列删去

del df['Unnamed: 0']
del df['a']
df

 【思考】还有其他的删除多余的列的方式吗?

方法一:使用pop()函数

df = pd.read_csv('test_1.csv')
df.pop('a')

注意:pop()函数的返回值是被删除的元素

使用要返回删除a列后的数据,要重新调用df

df = pd.read_csv('test_1.csv')
df.pop('a')
df.pop('Unnamed: 0')
df

方法二:使用drop()函数

详情见Drop函数的用法

注意:这里有时候报错可能是上面已经把a列删除了,所以这里要重新加载文件

df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1)

注意:这里返回的只是一个副本,原本的df的a列并没有被删除

df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1)
df

所以想要df中的a列被删除,还要加上inplace = True

df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1,inplace = True)
df

1.4.6 任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素

df.drop(['a'],axis = 1)

1.5 筛选的逻辑

表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。

下面我们还是用实战来学习pandas这个功能。

1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。

df[df['Age'] < 10]

1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage

midage = df[(10 < df['Age']) & (50 > df['Age'])]
midage

【提示】了解pandas的条件筛选方式以及如何使用交集'&'和并集'|'操作

1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来

midage.loc[[100],['Pclass','Sex']]

注意:这里虽然成功显示了出来,但是这个并不一定就是第100行的数据(马后炮一手)

为了可以清楚的知道数据对应的行数,我们增加‘PassengerId’列,并且创建midage.csv文件

midage.loc[[100],['Pclass','Sex','PassengerId']]
midage.to_csv('midage.csv')

结果发现上面的数据并不是第100行,所以这里要用到reset_index()函数

详情见reset_index()函数的用法

midage = midage.reset_index(drop=True)
midage.loc[[100],['Pclass','Sex','PassengerId']]

midage.to_csv('midage.csv')

发现这回显示的数据是对的,在第100行

1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass",

"Name"和"Sex"的数据显示出来

midage.loc[[100,105,108],['Pclass','Name','Sex']] 

 

1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass",

"Name"和"Sex"的数据显示出来

详情见iloc方法的用法

midage.iloc[[100,105,108],[2,3,4]]

【思考】对比ilocloc的异同 

loc:通过行标签索引行数据

当index 是整数:loc[n]表示索引的是第n行;当index 是字符:loc[‘d’]表示索引的是第’d’行

有行索引可以没有字段取值,但有字段取值前必须得有行索引,而且行索引只能为标签索引形式来取,不能按切片形式来取。单取切片形式可以,只是索引为左闭右闭。

iloc:通过行索引获取行数据

不能是字符,取索引必须按切片形式来取,不能按标签,这是与loc的不同。

索引为左闭右开。iloc也可以取指定行列,只不过得按切片形式索引,不能直接拿标签索引来做。

1.6 了解你的数据吗?

教材《Python for Data Analysis》第五章

开始之前,导入numpy、pandas包和数据,并且载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据

import numpy as np
import pandas as pd
df = pd.read_csv('train_chinese.csv')
df

 1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序

首先自己构建一个都为数字的DataFrame数据

df = pd.DataFrame(np.arange(8).reshape((2, 4)), 
                     index=['2', '1'], 
                     columns=['d', 'a', 'b', 'c'])
df

Pandas对DataFrame数据的排序方式(详情见排序函数sort_values()的用法)

1.让行索引升序排序

df.sort_index()

2.让列索引升序排序

df.sort_index(axis=1)

3.让列索引降序排序

df.sort_index(axis=1, ascending=False)

4.让任选两列数据同时降序排序

df.sort_values(by=['a', 'c'], ascending=False)

1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从数据中你能发现什么

df.sort_values(by=['票价', '年龄'], ascending=False)

【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。

我在创建了一个csv文件后发现,如果我们仅仅关注年龄和票价两列,我发现票价最高的100个人,最终存活了78人,而票价最低的100个人,最终只存活了15人,并且这15人皆为青壮年,由此可以看出票价越高的人的存活几率越高,年龄的差距主要是在票价低的群体中体现出来,因为青壮年遇到危险更容易逃生,当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

1.6.3 任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果

df_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
                     columns=['a', 'b', 'c'],
                     index=['one', 'two', 'three'])
df_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
                     columns=['a', 'e', 'c'],
                     index=['first', 'one', 'two', 'second'])
df = df_a + df_b
df

 【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有

对应的会变成空值NaN。当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可

以看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分,多在网络上查找相关学习资

料。

1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?

df = pd.read_csv('train_chinese.csv')
max(df['兄弟姐妹个数'] + df['父母子女个数'])

结果是10人

1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息

df = pd.read_csv('train_chinese.csv')
df.describe()

1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?

df = pd.read_csv('train_chinese.csv')
df['票价'].describe()

df = pd.read_csv('train_chinese.csv')
df['父母子女个数'].describe()

 

从上面两组数据可以看出票价的波动很大,75%的人的票价都低于平均值,说明大部分人其实都没什么钱,不能拖家带口地上船,所以75%的人都是孤身一人,没有家人在身边,只有那些有钱的富人才会把一家人都带上船,所以票价高的人一般情况下的家人都比票价低的人的家人数量多。

当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值