【数据分析入门】Task 03 数据重构
2.4 数据重构
2.4.1 数据介绍
本例子中一共给了四个文件,是泰坦尼克号训练集的切分,点击下载文件
原始的泰坦尼克号训练集大小:891*12,需要用到的四个文件
文件名 | 内容 | 大小 |
---|---|---|
train-left-up.csv | 泰坦尼克号训练集的左上部分 | 439*4 |
train-left-down.csv | 泰坦尼克号训练集的左下部分 | 452*4 |
text_right_up.csv | 泰坦尼克号训练集的右上部分 | 439*8 |
text_right_down.csv | 泰坦尼克号训练集的右下部分 | 452*8 |
导入库及所需文件
#导入基本库
import numpy as np
import pandas as pd
#导入文件
text_left_up = pd.read_csv("train-left-up.csv")
text_left_down = pd.read_csv("train-left-down.csv")
text_right_up = pd.read_csv("train-right-up.csv")
text_right_down = pd.read_csv("train-right-down.csv")
2.4.2 数据合并
Pandas包的merge、join、concat
方法可以完成数据的合并和拼接
merge
方法主要基于两个dataframe的共同列
进行合并join
方法主要基于两个dataframe的索引
进行合并concat
方法是对series或dataframe进行行拼接或列拼接
2.4.2.1 concat方法
concat方法是拼接函数,有行拼接和列拼接,默认是行拼接,拼接方法默认是外拼接(并集),拼接的对象是pandas数据类型
基本语法:
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False, copy=True):
参数 | 作用 |
---|---|
objs | 需要连接的对象集合,一般是列表或字典; |
axis | 连接轴向,0是按行合并,1时按列合并,默认为0; |
join | 连接方式,参数为‘outer’或‘inner’; |
join_axes=[] | 指定自定义的索引; |
keys=[] | 创建层次化索引; |
ignore_index=True | 重建索引 |
【注意】
pd.concat()
只是单纯的把两个表拼接在一起,
- 当
axis=0
时,pd.concat([obj1, obj2])
的效果与obj1.append(obj2)
是相同的; - 当
axis=1
时,pd.concat([obj1, obj2], axis=1)
的效果与pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')
是相同的
***
任务一:
(1)使用concat方法将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up;
(2)使用concat方法将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
(3)使用concat方法:将数据result_up,result_down合并为一张表,并保存这张表为result
***
#使用concat方法将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up¶
list_up=[text_left_up,text_right_up] #直接这样合并得到的是list类型,需要进一步将其转换为dataframe类型
print(type(list_up))
result_up=pd.concat(list_up,axis=1) #按照列合并,并将list类型转化为了dataframe
#使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
#使用concat方法:将数据result_up,result_down合并为一张表,并保存这张表为result
result = pd.concat([result_up,result_down])
result.head()
2.4.2.2 append方法
append()方法向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加
基本语法:
DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)
参数 | 作用 |
---|---|
other | DataFrame、series、dict、list这样的数据结构 |
ignore_index | 默认值为False,如果为True则不使用index标签 |
verify_integrity | 默认值为False,如果为True当创建相同的index时会抛出ValueError的异常 |
sort | boolean,默认是None |
2.4.2.3 merge方法
基本语法:
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
参数 | 含义 |
---|---|
left/right | 左/右位置的dataframe。 |
how | 数据合并的方式 left:基于左dataframe列的数据合并; right:基于右dataframe列的数据合并; outer:基于列的数据外合并(取并集); inner:基于列的数据内合并(取交集); 默认为’inner’。 |
on | 用来合并的列名,这个参数需要保证两个dataframe有相同的列名。 |
left_on/right_on | 左/右dataframe合并的列名,也可为索引,数组和列表。 |
left_index/right_index | 是否以index作为数据合并的列名,True表示是。 |
sort | 根据dataframe合并的keys排序,默认是。 |
suffixes | 若有相同列且该列没有作为合并的列,可通过suffixes设置该列的后缀名,一般为元组和列表类型。 |
***
任务二:
使用DataFrame自带的方法merge方法和append完成表的合并
***
result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True)
result_down = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()
2.4.2.4 join方法
join方法是基于index
连接dataframe,merge方法是基于column
连接,连接方法有内连接,外连接,左连接和右连接,与merge一致。
***
任务三:
使用DataFrame自带的方法join方法和append完成表的合并
***
resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()
2.5 换一种角度看数据
2.5.1 stack和unstack函数
在用pandas进行数据重排时,经常用到stack和unstack两个函数。stack的意思是堆叠,堆积,unstack即“不要堆叠”stack将columns变为index,unstack相反,将index变为columns,这个对于多层索引应用效果比较好,其实是为了聚合统计方便的
- stack()是将原来的列索引转成了最内层的行索引,这里是多层次索引,其中AB索引对应第三层,即最内层索引。
- unstack()是stack()的逆操作,这里把最内层的行索引还原成了列索引。但是unstack()中有一个参数可以指定旋转第几层索引,比如unstack(0)就是把第一层行索引转成列索引,但默认的是把最内层索引转层列索引
***
任务一:将我们的数据变为Series类型的数据,并将其保存为unit_result.csv
***
#将完整数据加载出来
text=pd.read_csv('result.csv')
#进行stack()操作
unit_result=text.stack().head(20) #只展示前20行数据
#type(unit_result) #经过查看是pandas.core.series.Series类型数据
unit_result
#将代码保存为unit_result,csv
unit_result.to_csv('unit_result.csv')
test=pd.read_csv('unit_result.csv')
test
2.6 数据运用
2.6.1 groupby函数
groupby 是pandas 中非常重要的一个函数, 主要用于数据聚合和分类计算. 其思想是“split-apply-combine”(拆分 - 应用 - 合并).
基本语法:
df[](指输出数据的结果属性名称).groupby([df[属性],df[属性])(指分类的属性,数据的限定定语,可以有多个).mean()(对于数据的计算方式——函数名称)
其中mean()可以是
参考资料:
***
任务一:
计算泰坦尼克号男性与女性的平均票价
***
可以发现女性的平均票价要比男性高,推测女性坐头等舱的比较多?
df=text['Fare'].groupby(text['Sex'])
means=df.mean()
means
***
任务二
统计泰坦尼克号中男女的存活人数
***
可以看出女性存活人数比男性高,女性的存活率233/314比男性233/577更是高出一大截,推测和泰坦尼克号中让女人和小孩先逃生的原因有关?
#查看男女各自人数
text['Sex'].value_counts()
#查看男女存活人数
survived_sex=text['Survived'].groupby(text['Sex']).sum()
survived_sex
***
任务三
计算客舱不同等级的存活人数
***
可以看出一等舱存活的人数最多,存活率也最高
#先看一下各个客舱的人数
text['Pclass'].value_counts()
#计算客舱不同等级的存活人数
survived_pclass=text['Survived'].groupby(text['Pclass']).sum()
survived_pclass
# survived_pclass = text['Survived'].groupby(text['Pclass'])
# survived_pclass.sum()
***
任务四
统计在不同等级的票中的不同年龄的船票花费的平均值
***
#pd.set_option('display.max_rows',None) #显示所有行
text.groupby(['Pclass','Age'])['Fare'].mean().head()
***
任务五
将男女平均票价和男女存活数量的数据合并,,并保存到sex_fare_survived.csv
***
#将男女平均票价和男女存活数量的数据合并
result=pd.merge(means,survived_sex,on='Sex')
result
result.to_csv('sex_fare_survived.csv')
***
任务六
得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)
#不同年龄的存活人数
survived_age=text['Survived'].groupby(text['Age']).sum()
survived_age
#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]
#计算总人数
_sum=text['Survived'].sum()
print('存活总人数为:',_sum)
#计算最大存活率
precetn=survived_age.max()/_sum
print('最大存活率为:',precetn)
2.6.2 agg聚合函数
groupby
后常进行的是聚合操作,通过聚合操作可以来求和、均值、最大值、最小值等
基本语法
agg(func,axis = 0,* args,** kwargs )
常用聚合操作
***
查看存活和死亡的最大年龄
***
text.groupby('Survived').agg({'Age': 'max'}).rename(columns=
{'Age': 'max_age'})
相关资料