笔者是第一次尝试采用线上分组学习的形式,感谢Datawhale的开源学习平台。本次动手学数据分析的任务就是完成kaggle上泰坦尼克号的task,从数据载入到数据清洗,最后到数据建模分析,完成整个数据分析的步骤。第一章是完成数据载入及使用函数来进行简单的数据观察。
第一章 数据载入及初步观察
1.1 载入数据
1.1.1 首先导入Python中常用的numpy和pandas库
import numpy as np
import pandas as pd
1.1.2 载入数据
#查看当前工作目录
import os
os.getcwd()
#1、使用相对路径载入数据
df=pd.read_csv('./train.csv')
df1=pd.read_table('./train.csv',sep=',')
#2、使用绝对路径载入数据
df2=pd.read_csv('D:/hands-on-data-analysis-master项目/第一单元项目集合/test_1.csv')
import numpy as np import pandas as pd1.1.2 载入数据
#查看当前工作目录
import os
os.getcwd()
#1、使用相对路径载入数据
df=pd.read_csv('./train.csv')
df1=pd.read_table('./train.csv',sep=',')
#2、使用绝对路径载入数据
df2=pd.read_csv('D:/hands-on-data-analysis-master项目/第一单元项目集合/test_1.csv')
read_csv()与read_table()的区别
同样都是从文件、URL、文件型对象中加载带分隔符的数据,其最大区别在pd.read_csv()默认用逗号分隔,对应.csv文件;而pd.read_table()默认用制表符("t")分隔,对应.tsv文件。只要把两者分隔方式改成一样,两者的效果就是一样。两种文件都可以使用pd.read_csv()和pd.read_table()来载入。
逐块读取
当文件数据过大时,整个读取会造成内存运行速度降低且占据较大内存,或者你只想读取文件的一小部分,采用逐块读取,加快读取速度且减少内存消耗。chunker返回的对象是TextFileReader类型。
chunker=pd.read_csv('./train.csv',chunksize=10)
type(chunker)
for i in chunker:
print(i)
修改表头
方法一:直接全部更改列名称
方法二:使用rename函数更改列名
#更改表头方法一
#df.columns=["乘客ID","是否幸存","乘客等级(1/2/3等舱位)","乘客姓名","性别","年龄","堂兄弟/妹个数","父母与小孩个数"," 船票信息","票价","客舱","登船港口"]
#更改表头方法二
df.rename(columns={'PassengerId':"乘客ID",'Survived':"是否幸存",'Pclass':"乘客等级(1/2/3等舱位)",'Name':"乘客姓名",'Sex':"性别"},inplace=True)
#更改索引
df1=df.set_index("乘客ID")
1.2 观察分析数据
查看数据基本信息
df.shape #查看行数和列数 df.info() #查看索引、数据类型和内存信息 df.describe() #查看数值型列的汇总统计 df.dtypes() #查看各字段类型 df.axes #显示数据行和列名 df.columns #显示列名
查看表格前10行和后15行数据
df.head(10) #查看表格前10行数据 df.tail(15) #查看表格后15行数据
判断数据是否为空
df.isnull() #判空,空返回True,非空返回False
1.3 保存数据
#将清洗过后的数据保存到当前工作目录
df1.to_csv("train_chinese1.csv",encoding='GBK')
1.4 了解数据(一)
1.4.1 了解pandas中Series和DataFrame
#Series
res=pd.Series([1,3,5,7,8],index=["A","B","C","D","E"])
print(res)
print("索引:",res.index)
print("数组:",res.values)
#DataFrame
df=pd.DataFrame({"X":['a','b','c'],"Y":range(2,5),"Z":[4,5,6]})
print(df)
df.loc[:,['Y']] #选取某一列
df.loc[:,['X','Y']] #选取多列
df.iloc[[0,1],:] #选取多行
1.4.2 载入train.csv文件
data=pd.read_csv('train.csv')
1.4.3 查看DataFrame数据每列名称
data.columns
1.4.4 查看某一列的所有值
方法一:使用loc函数
#方法一 data.loc[:,['Cabin']]
方法二:使用iloc函数
#方法二 data.iloc[:,[10]]1.4.5 对比两文件,删除不同列
#加载数据,并找出不同列
test_1=pd.read_csv("test_1.csv")
train=pd.read_csv("train.csv")
test_1.columns
train.columns
#删除列
#方法一 改变原始数据
del test_1['Unnamed: 0']
#方法二 删除不改变原始数据,可以通过重新赋值的方式赋值该数据
#test_1.drop('Unnamed: 0',axis=1)
#方法三 改变原始数据
test_1.drop('Unnamed: 0',axis=1,inplace='True')
1.4.6 隐藏部分列
test_1.drop(columns=['PassengerId','Name','Age','Ticket'],axis=1)
隐藏列和删除列操作可以都用drop函数,不同在于drop函数默认inplace=False,即不改变原数据,可以理解为隐藏原数据;如果使用inplace=True,就是替代原数据,即删除原数据。
1.5 筛选数据 1.5.1 单条件筛选#以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。 train[train.Age<10]1.5.2 多条件筛选
# 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage midage=train[(train.Age>10) & (train.Age<50)] midage1.5.3 取单行多列数据
#将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来¶ midage.loc[[100],['Pclass','Sex']]
在抽取数据时,其仍保持的是原先的索引,为了保持数据的相对顺序不变,可使用reset_index()重置索引函数。df.reset_index(inplace=True,drop=True)中drop参数为True时,直接丢弃原来的索引,否则原来的索引新生成一列名为'index'的列。
1.5.4 取多行多列pandas中有两种方法用来筛选数据。分别是:
1、loc函数。loc是Selection by Label函数,即按标签取数据,例如midage中行标签为0-890,列标签为"PassengerId","Survived","Pclass","Name"等,midage.loc[[100,105,108],['Pclass','Name','Sex']]
2、iloc函数。iloc是Selection by Position,即按位置选择数据,即第n行,第n列数据,只接受整型参数。例如midage.iloc[[100,105,108],[2,3,4]]
#loc方法 midage.loc[[100,105,108],['Pclass','Name','Sex']] #iloc方法 midage.iloc[[100,105,108],[2,3,4]]1.6 了解数据(二) 1.6.1 排序
#首先创建DataFrame对象
frame=pd.DataFrame({"X":range(5,8),"Y":[12,6,9],"Z":[4,5,6],"S":range(3,6)})
frame
1.按行索引升序排序
frame.sort_index(axis=0,ascending=True,inplace=True)
2.按列索引升序排序
frame.sort_index(axis=1,ascending=True,inplace=True)
3.按某列值升序排序
frame.sort_values(by="Y",axis=0,ascending=True,inplace=True)
4.让任选两列数据同时降序排序
frame.sort_values(by=["Y","S"],axis=0,ascending=[False,False],inplace=True)1.6.2 对泰坦尼克号数据进行排序分析
#按票价和年龄两列进行综合排序(降序排列) df.sort_values(by=["票价","年龄"],axis=0,ascending=[False,False],inplace=True) df.head(20)
从上述结果可以看出泰坦尼克号上票价越高,存活率越高;年龄越高,存活率越低
1.6.3 Pandas算术计算两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
#将frame_a与frame_b相加 frame_a=pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'],index=['one','two','three']) frame_b=pd.DataFrame(np.arange(16).reshape(4,4),columns=['S','X','A','Z'],index=['1th','2th','one','4th']) frame=frame_a+frame_b frame1.6.4 对泰坦尼克号数据进行计算分析
#泰坦尼克号数据如何计算出在船上最大的家族有多少人? #方法一 df["家族人数"]=df["兄弟姐妹个数"]+df["父母子女个数"] df.sort_values(by="家族人数",axis=0,ascending=False,inplace=True) df.head(20) #方法二 max(df["兄弟姐妹个数"]+df["父母子女个数"])1.6.5 查看泰坦尼克号数据基本统计信息
调用describe函数查看数据基本信息
df.describe() ''' count : 样本数据大小 mean : 样本数据的平均值 std : 样本数据的标准差 min : 样本数据的最小值 25% : 样本数据25%的时候的值 50% : 样本数据50%的时候的值 75% : 样本数据75%的时候的值 max : 样本数据的最大值 '''
从票价的统计信息可以看出票价的50%分位数远小于平均值,75%的分位值才接近平均值说明票价差距很大,即有一大部分人买的票价很便宜,同时也有一部分人的票价很贵,乘客的贫富差距较大。而父母子女个数标准差只有0.806057,波动性不大,说明每个人的父母子女个数差距不大。
总结:动手学数据分析的第一章数据载入及初步观察主要从载入数据,利用函数进行数据特征观察,数据筛选,排序等,其中边完成任务,边学习知识点,掌握了一些以前没注意到的地方,但学习下来感觉自己对数据敏感度不是很高,对于数据所表达出的深层次含义理解不到位。



