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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容