学习目录
- 第一节 数据载入及初步观察
- 第二节 pandas基础
- 1.4 知道你的数据叫什么
- 1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
- 1.4.2 任务二:根据上节课的方法载入"train.csv"文件
- 1.4.3 任务三:查看DataFrame数据的每列的名称
- 1.4.4任务四:查看"Cabin"这列的所有值 [有多种方法]
- 1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
- 1.4.6 任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
- 1.5 筛选的逻辑
- 第三节 探索性数据分析
- 【总结】
第一节 数据载入及初步观察
1.1 载入数据
1.1.1 任务一:导入numpy和pandas
import numpy as np
import pandas as pd
1.1.2 任务二:载入数据
(1) 使用相对路径载入数据
#导入相对路径数据
df=pd.read_csv('train.csv')
(2) 使用绝对路径载入数据
#绝对路径导入数据
path=os.path.abspath('train.csv')
df = pd.read_csv(path)
扩展
(1)显示表格行列数
#行列数
df.shape
(2)转置表格
#转置
df.T
转置前
转置后
(3)read_table默认无分隔
#无分隔数据
pd.read_table(path)
read_csv默认用逗号分隔,table用逗号分隔需设置参数
#以逗号为分割符
pd.read_table(path,sep=',')
1.1.3 任务三:每10行为一个数据模块,逐块读取
#逐块读取
df = pd.read_csv('train.csv',chunksize=10)
df.get_chunk()
逐块读取是为了将长文件可以截断读取分析。
逐块读取的类型和非逐块读取类型比较:
逐块读取不可进行head显示。
1.1.4 任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
第一种方法:
#将表头改为中文
df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
第二种方法:
#其他方法:多加一行
df = pd.read_csv('train.csv',names=['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'])
df
在读取文件时就改名,最后多加了一列,之前的列表名变为其中的行,一般不采取这种方式。(容易混淆数据)
1.2 初步观察
1.2.1 任务一:查看数据的基本信息
举例:
#1.查看数据基本信息
df.info()
#2.查看基本信息
df.describe()
#mean平均 std标准差
1.2.2 任务二:观察表格前10行的数据和后15行的数据
head()和tail()默认显示5列。
#观察表格前10行的数据
df.head(10)
#观察表格后15行的数据
df.tail(15)
1.2.4 任务三:判断数据是否为空,为空的地方返回True,其余地方返回False
#判断数据是否为空,为空的地方返回True,其余地方返回False
df.isnull()
1.3 保存数据
1.3.1 任务一:将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
df.to_csv('train_chinese.csv')
第二节 pandas基础
1.4 知道你的数据叫什么
1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
Series
第一个例子:
#Series带索引一维数组类型,random获取随机数
s=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
第二个例子:
第三个例子:
#字典形式
s=pd.Series({'b':1,'a':0,'e':2})
s
DataFrame
第四个例子:
#DataFrame二维数组,可用Series生成
d = {'one' : pd.Series([1.,2.,3.],index=['a','b','c']),'two': pd.Series([4.,5.,6.,7.],index=['a','b','c','d'])}
df = pd.DataFrame(d)
df
1.4.2 任务二:根据上节课的方法载入"train.csv"文件
这里使用相对路径引入。
df=pd.read_csv('train.csv')
1.4.3 任务三:查看DataFrame数据的每列的名称
df.columns
1.4.4任务四:查看"Cabin"这列的所有值 [有多种方法]
1.4.4任务四:查看"Cabin"这列的所有值 [有多种方法]
第一种方法:
df.Cabin
第二种方法:
df['Cabin']
类型查看:
可变成DataFrame类型:
#变成DataFrame类型
df[['Cabin']]
1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
加载文件"test_1.csv"
test_1 = pd.read_csv('test_1.csv')
test_1.head()
可以发现a列多余,将多出的a列删除:
第一种方式:
#删除多余的列
del test_1['a']
test_1.head()
第二种方式:
test_1.pop('a')
test_1.head()
第三种方式:
#生成删除列的数组的副本,文件本身未删除列
test_1.drop(['a'],axis=1)
第四种方式:
#不返回副本,直接保存进原文件
test_1.drop(['a'],axis=1,inplace = True)
test_1.head()
1.4.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
#列元素隐藏
test_1.drop(['PassengerId','Name','Age','Ticket'],axis=1)
1.5 筛选的逻辑
1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
#显示年龄在10岁以下的乘客信息
df[df["Age"]<10]
1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
#将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df["Age"]>10)& (df["Age"]<50)]
midage.head()
midage1 = df[(df["Age"]>10)|(df["Age"]<50)]
midage1.head()
比较&与|筛选数据的区别:
1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
#不加reset_index则会索引错误,寻找到原始数据索引100的,而不是midage中的第100行
midage.loc[[100],['Pclass','Sex','Name']]
midage1 = midage.reset_index(drop=True)
midage1.head()
midage1.loc[[100],['Pclass','Sex','Name']]
我们可以对比两种方式的索引,即可看出问题所在:
我们可以看出,不加reset_index则会索引错误,寻找到原始数据索引号,而而不是设置的midage中的索引号。、
1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage1.loc[[100,105,108],['Pclass','Name','Sex']]
1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#iloc用索引
#使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage1.iloc[[100,105,108],[2,3,4]]
通过对比可知,使用iloc方法时,参数是其列的索引号。
第三节 探索性数据分析
先导入所需包和数据:
1.6 了解你的数据吗?
1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序
#升序排序
sample= pd.DataFrame(np.random.randn(3, 3),
index=list('213'),
columns=list('bca'))
#让某一列从小到大排序
sample.sort_values('b')
# 让行索引升序排序
sample.sort_index()
# 让列索引升序排序
sample.sort_index(axis=1)
# 让列索引降序排序
sample.sort_index(axis=1, ascending=False)
# 让任选两列数据同时降序排序,无法同时时,则优先选by中第一个列优先排序
sample.sort_values(by=['c', 'a'], ascending=False)
1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从数据中你能发现什么
#对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列)
text.sort_values(by=['票价','年龄'], ascending=False)
发现: 优先根据票价排序,然后再根据年龄在票价基础上排序。并且票价越高死亡率越低,其中在票价最高的人里面没有一人死亡。
1.6.3 任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果
#利用Pandas进行算术计算,计算两个DataFrame数据相加结果
x= pd.DataFrame(np.random.randn(3, 3),
index=list('213'),
columns=list('bca'))
x
y= pd.DataFrame(np.random.randn(3, 3),
index=list('413'),
columns=list('bcd'))
y
#行和列都相同才有计算结果
x+y
1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
#通过泰坦尼克号数据如何计算出在船上最大的家族有多少人
max(text['堂兄弟/妹个数'] + text['父母与小孩个数'])
1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息
#使用Pandas describe()函数查看数据基本统计信息,第一节运行过
text.describe()
数据显示并不是很直观,我们可以引入直方图来看:
#画直方图
from matplotlib import pyplot as plt
#注意是否有空值,有空值会报错,例如年龄
plt.hist(text['是否幸存'])
利用直方图,我们可以从图中清楚的看到幸存者人数和死亡人数分别有多少。
1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
首先来分析一下票价:
text['票价'].describe()
可得票价平均32元,但最高票价达到512元。我们依旧可以利用图表来进行观察。
plt.hist(text['票价'])
我们可以发现票价分布具有长尾。
下面分析父母与小孩个数:
text['父母与小孩个数'].describe()
我们同样可以看出他的分布具有长尾,平均个数0.38.但最大个数为6个。下面是直方图的直观表达:
plt.hist(text['父母与小孩个数'])
我们可以明显看出独自出游的人占大多数。
【总结】
本章中我们通过对基础函数的操作对数据进行了初步统计查看,并逐渐构建了如何进行数据分析的思维。