【数据分析入门】Task03 数据重构

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)
参数作用
otherDataFrame、series、dict、list这样的数据结构
ignore_index默认值为False,如果为True则不使用index标签
verify_integrity默认值为False,如果为True当创建相同的index时会抛出ValueError的异常
sortboolean,默认是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()

在这里插入图片描述

相关资料:https://www.cnblogs.com/keye/p/10791705.html


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)就是把第一层行索引转成列索引,但默认的是把最内层索引转层列索引
    在这里插入图片描述

相关资料:pandas中DataFrame的stack()、unstack()和pivot()方法的对比

***
任务一:将我们的数据变为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'})

在这里插入图片描述

相关资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值