【数据分析入门】Task 01数据加载及探索性数据分析
- 第一章:数据加载
- 1.1 载入数据
- 1.1.1 导入numpy和pandas
- 1.1.2 载入数据
- 1.1.3 通过逐块读取提升处理效率
- 1.1.4 将表头改成中文,索引改成乘客ID
- 1.2 初步观察
- 1.2.1 查看数据的基本信息
- 1.2.2 查看数据前10行和后15行的数据
- 1.2.3 判断数据是否为空
- 1.3 保存数据
- 1.4 知道你的数据叫什么
- 1.4.1 pandas主要数据结构
- 1.4.2 重新载入数据并查看DataFrame数据每列的项
- 1.4.3 查看“cabin”这列的所有项
- 1.4.4 删除多余行或列
- 1.4.5 隐藏部分元素
- 1.5 筛选的逻辑
- 1.5.1 筛选数据
- 1.5.2 筛选并重命名
- 1.5.3 reset_index()
- 1.5.4 loc()和iloc()
- 1.6 进一步了解数据
- 1.6.1 对数据进行排序
- 1.6.2 利用pandas对DateFrame数据结果进行计算
- 1.6.3 利用describe()函数查看数据基本统计信息
第一章:数据加载
1.1 载入数据
kaggle泰坦尼克号获救数据集地址:https://www.kaggle.com/c/titanic/data
1.1.1 导入numpy和pandas
import numpy as np
import pandas as pd
如果加载失败,说明还未安装,安装方法为:
win+r进入cmd控制台
c:\user\admin>pip install pandas
c:\user\admin>python
>>>import pandas(验证是否安装成功)
- pandas手册:https://www.pypandas.cn/
- numpy手册:https://www.numpy.org.cn/
1.1.2 载入数据
1.载入数据方法:
(1)使用相对路径
df=pd.read_csv('train.csv')
df.head(3)
结果为
相对路径载入报错时,可以使用os.getcwd()
查看当前工作目录,该命令使用前必须载入import os, sys
(2)使用绝对路径
#使用相对路径载入数据
df=pd.read_csv('/数据分析/train.csv')
df.head(3)
2.pd.read_csv()
和pd.read_table()
区别
相关参数:
1.1.3 通过逐块读取提升处理效率
DataFrame是一个重量级的数据结构,当一个dataframe比较大,占据较大内存的时候,同时又需要对这个dataframe做较复杂或者复杂度非O(1)的操作时,会由于内存占用过大而导致处理速度极速下降。
对此,我们的方法是尽量避免直接对过大的dataframe直接操作(当然有时候没有办法,必须对整体的dataframe进行操作,这时就需要从其他方面优化,比如尽量较少不必要的列,以降低内存消耗),以从csv文件读取数据为例,可以通过read_csv方法的chunksize参数,设定读取的行数,返回一个固定行数的迭代器,每次读取只消耗相应行数对应的dataframe的内存
chunker=pd.read_csv('train.csv',chunksize=1000)
相关参考
- pandas性能提升之利用chunksize参数对大数据分块处理
- 用Pandas 处理大数据的3种超级方法
1.1.4 将表头改成中文,索引改成乘客ID
对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head()
其他更改表头方法python中dataframe更改列名称
- 使用rename函数更改列名
df2=df1.rename(columns={'name':'stu_name','class':'stu_class'}) print(df2)
- 直接更改全部的列名称
df1.columns=['id','stu_name','stu_class']
1.2 初步观察
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等
1.2.1 查看数据的基本信息
通过info()
函数查看数据的类型、个数
df.info()
1.2.2 查看数据前10行和后15行的数据
head()
与 tail()
用于快速预览 Series 与 DataFrame,默认显示 5 条数据,也可以指定显示数据的数量。
df.head(10)
df.tail(15)
1.2.3 判断数据是否为空
判断数据是否为空并返回前五行内容(为空的地方返回True,其余地方返回False)
df.isnull().head()
1.3 保存数据
- 写入csv
df.to_csv('文件名')
- 写入HDF5
df.to_hdf('文件名')
- 写入excel
df.to_excel('文件名')
相关参考:IO tools (text, CSV, HDF5, …)
此处将改变后的数据在工作目录下保存为一个新文件train_chinese.csv
df.to_csv('train_chinese.csv')
1.4 知道你的数据叫什么
1.4.1 pandas主要数据结构
pandas是基于NumPy构建的模块,pandas包含序列Series
(一维数据)和数据框DataFrame
(二维数据)两种最主要数据结构,索引Index
是跟序列和数据框密切相关的数据结构
- 序列(Series)的表现形式为:索引在左边,值在右边。由于没有显式为Series指定索引,pandas会自动创建一个从0到N-1的整数型索引。
- 数据框(DataFrame)是二维的关系表格型数据结构,含有一组有序的列,每列的数据类型是相同的,列与列之间的数据类型可以不同,也可以相同。数据框的逻辑结构是行和列,列有列名(或叫做列索引),行有行索引,还可以为行或列索引设置标签。
- 序列和数据框之间是密切关联的,可以认为序列(Series)是二维表格中的一列或者一行。实际上,当访问DataFrame的一行时,pandas自动把该行转换为序列;当访问DataFrame的一列时,Pandas也自动把该列转换为序列。
- Index对象是序列和数据框必不可少的成分,负责管理轴标签,轴名称等元数据,对于数据框,行有行索引,列有列索引;对于序列,行索引是必备的。索引对象是不可修改的,类似一个固定大小的数组
【例1】创建一个序列,并自定义索引(如果不定义,索引默认从0到N-1)
import numpy as np
import pandas as pd
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1=pd.Series(sdata)
example_1
相关参考:pandas基础 - 数据结构和数据类型
1.4.2 重新载入数据并查看DataFrame数据每列的项
使用df.columns
查看每列列名
import numpy as np
import pandas as pd
df=pd.read_csv('train.csv')
df.head()
df.columns
1.4.3 查看“cabin”这列的所有项
方法一:
df['Cabin'].head()
方法二:
df.Cabin.head()
1.4.4 删除多余行或列
(1)删除行
方法一:drop
- 通过行名称删除,如
df.drop(['1', '3'], inplace=True)
- 通过行号删除,如
df.drop(df.index[0], inplace=True)
方法二:通过各种筛选方法实现删除行
(2)删除列
方法一:del
如del df['A'] # 删除A列,会就地修改
方法二:drop
- 通过列名称删除:
df = df.drop(['B', 'C'], axis=1)
- 使用列数删除,传入参数是int,列表,者切片:
df.drop(df.columns[0], axis=1, inplace=True)
参考:pandas删除某些列、行总结
1.4.5 隐藏部分元素
如果想要完全的删除你的数据结构,使用inplace=True
,因为使用inplace就将原数据覆盖了,所以这里没有用
将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
1.5 筛选的逻辑
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
参考:使用Pandas对数据进行筛选和排序
1.5.1 筛选数据
以“Age”为筛选条件,显示年龄在10岁以下的乘客信息
df[df['Age']<10].head()
1.5.2 筛选并重命名
以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage=df[(df['Age']>10)&df['Age']<50]
midage.head()
1.5.3 reset_index()
reset_index()
主要用于重置索引,在获得新的index,原来的index变成数据列,保留在数据框中,不想保留原来的index的话可以使用参数drop=True,默认False
。
参考:https://www.jianshu.com/p/223de3248f90
将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage = midage.reset_index(drop=True)
midage.head(10)
midage.loc[[99],['Pclass','Sex']]
1.5.4 loc()和iloc()
-
loc
即location, 是按dataframe 的index 名称进行索引。 -
iloc
是按dataframe 的index 位置(0,1,2,… )进行索引。
分别使用loc和iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.loc[[100,105,108],['Pclass','Name','Sex']]
#因为你主动的延长了行的距离,所以会产生表格形式
#注意此处列名的表示方法
midage.iloc[[100,105,108],[2,3,4]]
1.6 进一步了解数据
1.6.1 对数据进行排序
Pandas 支持三种排序方式,按索引标签排序,按列里的值排序,按两种方式混合排序
(1)按索引标签排序df. sort_index()
- 作用:默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
- 注意:df. sort_index()可以完成和df. sort_values()完全相同的功能,但python更推荐用只用df. sort_index()对“根据行标签”和“根据列标签”排序,其他排序方式用df.sort_values()。
- 调用方式:
sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
- 参数说明
参数 | 说明 |
by | 指定列名(axis=0或’index’)或索引值(axis=1或’columns’) |
axis | 若axis=0或’index’,则按照指定列中数据大小排序;若axis=1或’columns’,则按照指定索引中数据大小排序,默认axis=0 |
level | 默认None,否则按照给定的level顺序排列 |
ascending | 是否按指定列的数组升序排列,默认为True,即升序排列 |
inplace | 是否用排序后的数据集替换原来的数据,默认为False,即不替换 |
kind | 排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。 |
na_position | {‘first’,‘last’},设定缺失值的显示位置 |
(2)按列中的值进行排序df. sort_values()
- 作用:既可以根据列数据,也可根据行数据排序。
- 注意:必须指定by参数,即必须指定哪几行或哪几列;无法根据index名和columns名排序(由
.sort_index()
执行) - 调用方式:
DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
- 参数说明:
参数 | 说明 |
by | 指定列名(axis=0或’index’)或索引值(axis=1或’columns’) |
axis | 若axis=0或’index’,则按照指定列中数据大小排序;若axis=1或’columns’,则按照指定索引中数据大小排序,默认axis=0 |
ascending | 是否按指定列的数组升序排列,默认为True,即升序排列 |
inplace | 是否用排序后的数据集替换原来的数据,默认为False,即不替换 |
na_position | {‘first’,‘last’},设定缺失值的显示位置 |
(3)按索引与值排序
通过参数 by 传递给 DataFrame.sort_values()
的字符串可以引用列或索引层名。
参考:https://www.jianshu.com/p/f0ed06cd5003
对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列)
通过观察数据可以发现,票价越高的存活率越高
text.sort_values(by=['票价', '年龄'], ascending=False).head(20)
1.6.2 利用pandas对DateFrame数据结果进行计算
两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN
如有frame1_a
为
frame1_b
为
frame1_a + frame1_b
为
通过泰坦尼克号数据如何计算出在船上最大的家族有多少人
结果为10
max(text['兄弟姐妹个数']+text['父母子女个数'])
1.6.3 利用describe()函数查看数据基本统计信息
利用describe()
函数将返回如下数据
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
查看泰坦尼克号数据各列数据的基本统计数据
可以发现
- 年龄数据存在缺失,姓名性别等数据由于非数值型所以不会被统计
- 幸存率仅为0.38+
- 三等舱的人最多
- 票价数据平均值约为:32.20, 标准差约为49.69,说明票价波动特别大
text.describe()