栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Datawhale分组学习—动手学数据分析(一)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Datawhale分组学习—动手学数据分析(一)

笔者是第一次尝试采用线上分组学习的形式,感谢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')

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)]
midage
1.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
frame
1.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,波动性不大,说明每个人的父母子女个数差距不大。

总结:动手学数据分析的第一章数据载入及初步观察主要从载入数据,利用函数进行数据特征观察,数据筛选,排序等,其中边完成任务,边学习知识点,掌握了一些以前没注意到的地方,但学习下来感觉自己对数据敏感度不是很高,对于数据所表达出的深层次含义理解不到位。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971260.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号