由Datawhale组织的数据分析学习分为三个章节:
1.数据加载,Pandas基础与探索性数据分析;
2.数据清洗及特征处理,数据重构,数据可视化;
3.模型搭建,模型评估。
本篇文章为数据分析第一章的学习笔记,数据来源于kaggle竞赛的Titanic数据,记录笔记以备复习参考。
import numpy as np
import pandas as pd
import os
#df=pd.read_csv('train.csv') #相对路径
#df.head(3)
os.getcwd() #由于相对路径运行失败,故查找其当前工作目录,发现只有把train.csv用在desktop下才能正常运行,故使用下面的绝对路径
df=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/train.csv')
df.head(3) #只输出三行
chunker=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/train.csv',chunksize=1000)
分块读取可以减少内存、IO的消耗,提高效率
df=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/train.csv',names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)#header=0是从乘客ID第0个的下一个开始
df.head() #第一行看作列名
将表头改为中文,有利于表格以我们更熟悉的方式显示
初步观察表格数据的基本信息,有利于后续的探索性研究。
df.info()
df.head(10)
df.tail(15)
df.isnull().head()
df.to_csv('train_chinese.csv')
先举个小例子:
import numpy as np
import pandas as pd
sdata={'Ohio':35000,"Texas":71000,'Oregon':16000,'Utah':5000}
example_1=pd.Series(sdata) #时间序列数据
example_1
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002,2003],'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
example_2=pd.DataFrame(data) #数据框
example_2
重回我们的Titanic数据集,载入之前的“train.csv”文件,用df.head(3)显示表格前三行,也可用print(df)显示所有行。
df=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/train.csv')
df.head(3)
#print(df)
df.columns #查看DataFrame数据每列的项
查看Cabin(客舱)这列的所有项,有两种方法可以实施
df['客舱'].head(3) #查看“cabin”这列的所有项
#df.Cabin.head(3)
显示以下测试集,与训练集进行对比,看各列是否一一对应
test_1=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/test.csv')
test_1.head(3)
因为下载数据集是没有多余列的,所以不进行删列操作,若要进行需要输入以下行:
#没有多余的列 所以暂时不需要删除
#del test_1['a'] #a为多余那列的列名
#test_1.head(3) #再查看以下是否删除
将某几列进行隐藏,只显示感兴趣的几列信息,这里输入代码的是待删除列名:
df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
用以下方法也可以只显示感兴趣的信息,只是思路不在于隐藏,而在于显示:
pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/test.csv',usecols=['Name','Age','Ticket']).head(3)
#d=pd.read_csv('/Users/Administrator/LC python/datawhale/data analysis/unit 1/Titanic-dataset/test.csv',usecols=['Name','Age','Ticket'])
#print(d)
最终还是得到上述结果:
在此要强调一下inplace与drop的区别:
可以看一下在drop和read操作之后,原数据结构是没变的:
df.head(3)
首先筛选十岁以下的乘客信息:
#筛选 显示在十岁以下的乘客信息
df[df['Age']<10].head(3)
接着筛选年龄在十岁到五十岁之间的乘客信息,并将这个数据命名为midage:
#筛选 显示在10到50之间的乘客信息(不包括10和50) 并命名为midage
midage=df[(df["Age"]>10)&(df["Age"]<50)]
midage.head(3)
将midage数据中第100行的"Pclass"和"Sex"数据显示出来,在此之前需要重置索引,因为对DataFrame的一系列操作会令索引发生混乱,所以需重置:
midage=midage.reset_index(drop=True)
midage.head(3)
midage.loc[[100],['Pclass','Sex']]
1)使用loc方法将midage数据的第100,105,108行的Pclass,Name,Sex的数据显示出来:
#使用loc方法将midage数据的第100,105,108行的Pclass,Name,Sex的数据显示出来
midage.loc[[100,105,108],['Pclass','Name','Sex']]
2)使用iloc方法也得到了同样的输出,这是因为用表格的索引“乘客ID”是从1(而非0)开始计数的,所以输出相同:
midage.iloc[[100,105,108],[2,3,4]] #iloc方法也可以达到如上操作
也就是说,如果上述DataFrame的索引名称是从0开始,则df.iloc()会输出索引名称为99,104,107的三行(对应的行数才是100,105,108)。
在本节将利用Pandas进行排序、算术计算,并着手使用describe()函数。
import numpy as np
import pandas as pd
test=pd.read_csv('train_chinese.csv')
test.head()
下面对数据进行描述性分析,包括数据的排序、对两个数据框进行相加操作、对数据的基本统计(概括性数字度量)信息进行查看。
我们先构建一个简单的纯数字型DataFrame数据
#自己构建一个都为数字的DataFrame
frame=pd.DataFrame(np.arange(8).reshape(2,4),
index=['2','1'],
columns=['d','a','b','c'])#注意最后的小括号,这三行都是在定义这个frame,容易失误
frame
代码解析如下:
代码运行如下:
import pandas as pd
frame.sort_values(by='c',ascending=False)
#frame.sort_values(by='c',ascending=False,inplace=True) #如果上述代码运行失败,可以尝试加个inplace=True
可以看到sort_values这个函数中by参数指向要排列的列,ascending参数指向排序的方式(升序True还是降序False)。
#让行索引升序排序
frame.sort_index()
#让列索引升序排序
frame.sort_index(axis=1)
#让列索引降序排序
frame.sort_index(axis=1,ascending=False)
#让行索引降序排序
frame.sort_index(ascending=False)
1)对刚刚的简单例子进行两列排序:
#让任选两列数据同时降序排序
frame.sort_values(by=['a','c'],ascending=False)
2)对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),票价写在前面,就先按照票价降序、再按照年龄降序:
test.sort_values(['票价','年龄'],ascending=False).head(3)
排序后,仅观察年龄和票价两列:发现票价越高的应该客舱越好,因为票价前20的乘客中存活的有14人,这是相当高的一个比例;年龄和存活之间我是真没得出什么规律,还得跟小伙伴探讨一下。
(还可以考虑一下性别、父母子女个数及客舱数)
先构造两个数据框,然后将其相加
frame1_a=pd.DataFrame(np.arange(9.).reshape(3,3),
columns=['a','b','c'],
index=['one','two','three'])
frame1_b=pd.DataFrame(np.arange(12.).reshape(4,3),
columns=['a','e','c'],
index=['first','one','two','second'])
frame1_a
frame1_b
frame1_a + frame1_b #两个DataFrame相加时返回一个新的df,对应的行列值会相加,没有对应的会变成空值
观察发现,两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
#计算出船上最大的家族有多少人,用train_chinese.csv
max(df['SibSp']+df['Parch']) #计算训练集最大家族人数
#或者max(test['兄弟姐妹个数']+test['父母子女个数']),是计算测试集最大家族人数
此处输出为“10”。
frame2=pd.DataFrame([[1.4,np.nan], #学习如何写一个几行几列的表格,其中有空值NaN,标记索引与列标题
[7.1,-4.5],
[np.nan,np.nan],
[0.75,-1.3],
], index=['a','b','c','d'],columns=['one','two'])
frame2
frame2.describe()
"""
count:样本数据大小
mean:样本数据均值
std:标准差
min:最小值
25%,50%,75%:几个四分位点
max:最大值
"""
第一列一共有3个数据,其平均值为3.08,标准差为3.49,证明波动有点大,25%的数据低于1.07,50%低于1.40,75%低于4.25,最大值为7.1,最小值为0.75;第二列同样进行分析。
#数据中票价和父母子女这列的发现
test['票价'].describe()
从上述数据我们可以发现:
一共有891个票价数据,其平均值为32.204208,标准差为49.69,证明票价波动特别大,25%的人票价低于7.91,50%低于14.45,75%低于31,票价最大值为512.33,最小值为0。
到这里第一章节就结束啦,通过第一章节的学习,了解了如何查看数据、设置索引、对数据做出修改,筛选及排列数据、列数据作简单数学运算,得到数据的统计特征值,最后根据以上操作对数据进行初步的探索分析。