Task03:数据重构

1.数据合并

1.1数据合并方法对比

  • pd.merge:数据横向合并,merge(左表,右表)输入两个数据框,设置on参数就是按照某共同列合并,how设置连接方式有左连接,右连接,外连接,内连接,默认内连接。left_index,right_index为true就是按照行Index合并,因为每一行的对象是相同的,比如本例。

  • df1.join(df2):数据横向合并,和merge类似.但是是df1.join(df2),设置on参数就是按照共同列进行拼接,有做连接,右连接,【外连接】,内连接。外连接需要的时候再看。

  • df1.append(df2):数据末尾添加行,上下堆叠。不能做横向合并。

  • pd.concat([df1,df2],axis=0):数据必须是一个参数输入,如[df1,df2]。通过设置axis=0,1就可以选择合并/拼接的方向,从而实现两种功能。axis=0上下堆叠,axis=1横向合并。Join可设置拼接方式内连接和外连接,默认是外连接。

1.2merge方法横向合并

  • pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixe=('x','y'),copy=True,indicator=False,validate=None)

    • left:合并时左边的DataFrame
    • right:合并时右边的DataFrame
    • how:合并的方式,默认Inner.还有outer,left,right。
    • on:需要合并的列名,必须两边都有的列名,并以left,right中的列名的交集作为连接键
    • left_on:left dataframe中用作连接键的列,是在两个表里表示同一信息但是列名起的不一样的时候用。
    • right_on:right dataframe中用作连接键的列
    • left_index:用索引作为拼接的主键,默认时false,调整为true。将左侧的行索引用作连接键。常用于行索引相同的,比如第一行都是张三,第二行都是李四,即两表的每行都是同一个对象。像本表就是这样,没有相同列,用索引作为拼接的主键。
    • suffixes=('',''):suffixes后缀,添加后缀。给除了主键之外的相同列添加后缀。当两个表中有多个相同的列名,只将一个作为主键,那么其他列在合并后就会出现多次,那么为了区分这两个数据到底是哪个表的,就可以在suffixes中添加两者的区别。比如相同的列是编名,可以suffixe=('_left','_right'),最终得到两列的列名分别是:编号_left,编号_right
    • indicator:设置为true会多一列数据数据显示每行数据是来自左表,右表还是两者。
  • 作用:根据单个或多个键将不同的DataFrame的行连接起来,即横向合并,与数据库中的连接类似。只能用于两个表的拼接,分为左表和右表。参数中没有指定拼接轴的参数,所以不能用于表的上下拼接。纵向合并用append()函数

    • 如果需要拼接的两个表中,有相同的列信息,那么进行拼接的时候即使不指定以哪个字段作为主键函数也会默认适用信息相同的列作主键对两个表进行拼接。
    • 如果两表中有两列以上信息相同,可以通过参数on指定主键,若不指定,所有列都会作为拼接依据。
  • 连接方式:可以参照数据库的内连,外连(左连接,右连接)来理解。

    • 内连接inner:求两表的交集
    • 全连接outer:求两表的并集,A独有的+B独有的+AB共有的
    • 左连接left:保留左表右的所有信息,
    • 右连接right:保留右表的所有信息

1.3concat方法上下堆叠,横向合并

  • ’pd.concat‘:沿着指定的轴将多个DataFrame或Series拼接到一起,与pd.merge不同,pd.merge只能横向拼接。

  • pd.concat(objs,axis=0,join='outer',ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True)

    • objs:待合并的所有数据集,一般为series或dataframe

    • axis:默认=0,上下堆叠。axis=1则左右拼接。合并时参考的轴,axis=0表示基于行合并,axis=1为列合并,默认0.

    • join:连接方式,默认外连接,内连接取交集,外连接取并集。

    • keys和names:当表格拼接后,如果要知道数据的来源表,可以通过keys参数设置,names可以给拼接后信诚的数据结构添加名字。不常用,如果需要再查看详细的用法。

    • sort:排序。具体用的时候再看,默认不排序。

1.4append方法尾部添加

  • 方法:df.append(other,ignore_index=False,verify_integrity=False,sort=None)
    • other:要添加的数据,可以是dataframe,series,字典,列表
    • ignore_index:两个表的index是否有实际含义,默认为false。若ignore_index=True,表根据列名对齐合并,生成新的index.
    • verify_integrity:默认为false,若为true,创建具有重复项的索引时发生valueerror
    • sort:默认为false。若为true如果self和other的列没有对齐,则对列进行排序。

1.5join方法横向合并

  • 方法:df.join(other,on=None,how='left',lsuffix='',rsuffix='',sort=False)

    • 增加列。用其他dataframe来增加列,一般两个数据框的行index应该是相同或非常相似。

    • other:DataFrame或series或dataframe的列表

    • on:可选参数,如果不输入默认用相同列。或者用index-on-index

    • how:左连接left,右连接right,外连接outer,内连接inner,

    • lsuffix:左表重叠列的后缀,rsuffix:右表重叠列的后缀

    • sort:通过join键按字典顺序对结果进行排序。

2.将DataFrame变为Series:df.stack()

  • stack()堆叠作用:将列中数据透视/旋转到行,操作后返回对象是Series类型。此时,将列数据旋转到行上,且行上会形成多层索引。

  • df.stack(level=-1,dropna=True)

    • level:选择哪一个索引透视到行,=-1表示最后一个,也可以根据索引的名字进行设置。
    • dropna:是否删除掉有缺失值的
data = pd.DataFrame(np.arange(6).reshape((2,3)),
                    index=pd.(Index['A','B'],name='state'),
                    columns=pd.Index(['one','two','three'],name='number))'

原数据:

number          one     two        three
state           
A                0        1           2
B                3        4           5

将列旋转到行,行上的索引由1层变为了两个,形成了一个有两层索引的Series

state     number
A         one       0
          two       1
          three     2
B         one       3
          two       4
          three     5
dtype: int32
  • unstack():将行旋转到列,变回stack()之前的样子。但是可以通过输入层级序号或名称来拆分一个不同的层级。比如可以通过将level设置为0就将state那一个索引转成列标题了。或者设置成层级的名称,比如上面的'state'

  • result.unstack(level=-1,fill_value=None)

    • level:默认为-1,即最后一个索引水平。0为第一个索引水平。
    • fill_value:如果有缺失值,用什么替代。

3.数据聚合与运算

  • groupby对数据进行分组的操作过程:split-apply-combine

    • split:按照键值或分组变量将数据分组。分组键是数组,列表,Series等,要与待分组变量的轴长度保持一致。默认axis=0按行分组,指定axis=1对列分组。
    • apply:应用聚合函数,可以是Python自带的,比如sum,avg等,也可以是自己编写的函数
    • combine:即将函数计算后的结果聚合


      groupby.jpg
  • 分组键可以有多种形式,且类型不必相同

    • 列表或数组,其长度与待分组的轴一样
    • 表示DataFrame某个列名的值
    • 字典或Series给出待分组轴上的值域分组之间的对应关系
    • 函数,用于处理索引或索引中的各个标签

4.datawhale例子

4.1数据合并

  • 观察数据
# 导入基本库
import numpy as np
import pandas as pd

#查看数据
train_left_down          # passengerid从440到891,id列,survived列,pclass列,name列
train_left_down.shape    # 452*14
train_left_up            # passengerid从1到439,id列,survived列,pclass列,name列
train_left_up.shape      # 439*4
train_right_down         # sex列,age列,sibsp列,parch列,ticket列,fare列,cabin列,embarked列
train_right_down.shape   # 452*8
train_right_up.shape     # 439*8
train_right_up           # sex列,age列,sibsp列,parch列,ticket列,fare列,cabin列,embarked列
  • 观察数据可以发现:四个整合起来是train.csv,将train.csv分成了上下左右四块。左上left_up,右上right_up,左下left_down,右下right_down.

  • 合并数据

# 将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up

result_up = pd.concat([train_left_up,train_right_up],axis=1)
result_up.head()

# 横向合并train-left-down和train-right-down,pd.concat([obj1,obj2],axis=1),或pd.merge
result_down = pd.concat([train_left_down,train_right_down],axis=1)
result_down.head()

# 将上边的result_up和result_down纵向合并为result
result = pd.concat([result_up,result_down],axis=0)
result

# 任务二:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
result_up = train_left_up.join(train_right_up)
result_up

# 任务三:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。
result_down = train_left_down.join(train_right_down)
result_down

# 任务二:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
result_up = pd.merge(train_left_up,train_right_up,left_index=True,right_index=True)
result_up      # 不按照共同列进行合并,按照同样的行index进行合并就需要设置left_index和right_index为true

# 任务三:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。
result_down = pd.merge(train_left_down,train_right_down,left_index=True,right_index=True)
result_down

# 任务四:将result_up和result_down合并为result
result = result_up.append(result_down)
result
  • 都用append是因为append完成的是上下堆叠,merge和join都只能完成横向合并,所以两次都有append。
  • 将数据变为Series类型
# 将数据变为Series类型的数据
result = pd.read_csv('./data/result.csv')
result_series = result.stack()
result_series

4.2数据聚合与运算

# 计算泰坦尼克号男性与女性的平均票价
mean_sex = result['Fare'].groupby(result.Sex).mean()
mean_sex
# 统计泰坦尼克号中男女的存活人数
survived_sex = result['Survived'].groupby(result.Sex).sum()
survived_sex
# 计算客舱不同等级的存活人数
survived_pclass = result['Survived'].groupby(result.Pclass).sum()
survived_pclass
# 用agg()函数同时计算男性与女性的平均票价
result.groupby('Sex').agg({'Fare':'mean','Sex':'count'}).rename(
    columns={'Fare':'mean_fare', 'Sex': 'count_sex'})
# 但是这里算出来的是所有男性和女性的人数

# 统计不同等级的票中不同年龄的船票花费的平均值
result.groupby(['Pclass','Age'])['Fare'].mean()
# 数据合并且保存
result_sex = pd.merge(mean_sex,survived_sex,on='Sex')
result_sex

# 不同年龄总的存活人数
survived_age=result['Survived'].groupby(result.Age).sum()
survived_age
# 存活人数最多的年龄
survived_age[survived_age.values==survived_age.max()]
# 计算存活人数最高的存活率=存活人数/总人数

percent = survived_age.max()/result['Survived'].sum()
percent

你可能感兴趣的:(Task03:数据重构)