pandas 笔记:合并操作

1 concat

将数据根据不同的轴进行简单的融合

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

1.1 主要参数说明

objsseries,dataframe构成的序列lsit 
axis

需要合并链接的轴,

0是行(a[...][0] 和 b[...][0]合并,a[...][1] 和 b[...][1]合并)

1是列(a[0][...] 和 b[0][...]合并,a[1][...] 和 b[1][...]合并)

join

连接的方式 inner,或者outer

如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集

key识别数据源自于哪张表
ignore_index设置为true之后,合并的两个表就会根据列字段对齐,然后合并。最后再重新整理一个新的index

1.2 axis

需要合并链接的轴,

lst1=[['a0','b0','c0','d0'],
     ['a1','b1','c1','d1'],
     ['a2','b2','c2','d2'],
     ['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
     ['a5','b5','c5','d5'],
     ['a6','b6','c6','d6'],
     ['a7','b7','c7','d7']]
lst3=[['a8','b8','c8','d8'],
     ['a9','b9','c9','d9'],
     ['a10','b10','c10','d10'],
     ['a11','b11','c11','d11']]
df1=pd.DataFrame(lst1)
df2=pd.DataFrame(lst2)
df3=pd.DataFrame(lst3)

0是行(a[...][0] 和 b[...][0]合并,a[...][1] 和 b[...][1]合并)【默认】

pd.concat([df1,df2,df3],axis=0)

 

1是列(a[0][...] 和 b[0][...]合并,a[1][...] 和 b[1][...]合并)

pd.concat([df1,df2,df3],axis=1)

1.3 key

识别数据源自于哪张表

 依旧是1.2的数据

pd.concat([df1,df2,df3],axis=0,keys=['df1','df2','df3'])

pd.concat([df1,df2,df3],axis=1,keys=['df1','df2','df3'])

 1.3.1 也可以传入字典来增加分组键 

lst1=[['a0','b0','c0','d0'],
     ['a1','b1','c1','d1'],
     ['a2','b2','c2','d2'],
     ['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
     ['a5','b5','c5','d5'],
     ['a6','b6','c6','d6'],
     ['a7','b7','c7','d7']]
df1=pd.DataFrame(lst1)
df2=pd.DataFrame(lst2)
pd.concat({'df1':df1,'df2':df2})

 1.4 join

连接的方式 inner,或者outer

如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集【默认outer】

lst1=[['a0','b0','c0','d0'],
     ['a1','b1','c1','d1'],
     ['a2','b2','c2','d2'],
     ['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
     ['a5','b5','c5','d5'],
     ['a6','b6','c6','d6'],
     ['a7','b7','c7','d7']]
df1=pd.DataFrame(lst1,columns=['A','B','C','D'])
df2=pd.DataFrame(lst2,columns=['A','B','E','F'])
pd.concat([df1,df2],axis=0,join='inner')

pd.concat([df1,df2],axis=0,join='outer')

1.5 ignore_index 

设置为true之后,合并的两个表就会根据列字段对齐,然后合并。最后再重新整理一个新的index

lst1=[['a0','b0','c0','d0'],
     ['a1','b1','c1','d1'],
     ['a2','b2','c2','d2'],
     ['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
     ['a5','b5','c5','d5'],
     ['a6','b6','c6','d6'],
     ['a7','b7','c7','d7']]
df1=pd.DataFrame(lst1)
df2=pd.DataFrame(lst2)
pd.concat([df1,df2],axis=0)

 

pd.concat([df1,df2],axis=0,ignore_index=True)

 

2 append

默认沿着列进行拼接

 result = df1.append(s2, ignore_index=True)

 3 merge

pd.merge()只能用于左右两个表的拼接,不能用于表的上下拼接。

pd.merge( 
    left, 
    right, 
    how='inner', 
    on=None, 
    left_on=None, 
    right_on=None, 
    left_index=False, 
    right_index=False, 
    sort=False, 
    suffixes=('_x', '_y'), 
    copy=True, 
    indicator=False, 
    validate=None,)

left和right就是我们要merge的两个DataFrame

3.0 默认情况

首先,如果两个表格只有一个字段是一样的,那么就按照这个字段合并

比如我们有这样两个DataFrame (路名均为虚拟路名)

import pandas as pd
data=[{'道路名称': '齐鹏中路','平均车速(工作日)':60,'拥挤情况(工作日)':'畅通'},
     {'道路名称': '文蓁西路','平均车速(工作日)':45,'拥挤情况(工作日)':'拥挤'},
     {'道路名称': '济鹏南路','平均车速(工作日)':75,'拥挤情况(工作日)':'畅通'}]
df_1=pd.DataFrame(data)
df_1

import pandas as pd
data2=[{'道路名称': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞'},
     {'道路名称': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通'},
      {'道路名称': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞'}]
df_2=pd.DataFrame(data2)
df_2

 此时直接merge,就会按照“道路名称”相同的来进行合并

pd.merge(df_1,df_2)

  

如果两个DataFrame有两列是一样的呢?

import pandas as pd
data3=[{'道路名称': '齐鹏中路','平均车速(工作日)':60,'拥挤情况(工作日)':'畅通','施工与否':False},
     {'道路名称': '文蓁西路','平均车速(工作日)':45,'拥挤情况(工作日)':'拥挤','施工与否':False},
     {'道路名称': '济鹏南路','平均车速(工作日)':75,'拥挤情况(工作日)':'畅通','施工与否':False}]
df_3=pd.DataFrame(data3)
df_3

import pandas as pd
data4=[{'道路名称': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞','施工与否':True},
     {'道路名称': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通','施工与否':False},
      {'道路名称': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞','施工与否':True}]
df_4=pd.DataFrame(data4)
df_4

此时默认合并时内连接:只有两个相同列上的元素都一样的列才会被选择

pd.merge(df_3,df_4)

 3.1 on 参数——选择哪个字段作为merge的key

这个参数确定哪个字段作为主键

比如我们合并df1和df2的时候,设置主键位“道路名称”也是OK的

pd.merge(df_1,df_2,on='道路名称')

 对于前面的df3和df4,我们可以选择一个列来进行merge

pd.merge(df_3,df_4,on='道路名称')

3.2  leftindex & rightindex——是否使用索引

除了指定字段作为主键以外,还可以考虑用索引作为拼接的主键,leftindex和rightindex默认为False,就是不以索引作为主键,同时调整为True就可以了。

pd.merge(df_1,df_2,left_index=True,right_index=True)

 3.3 how——拼接方法

        how参数控制拼接方式,默认内连接(inner),内连接是只将两个表主键一致的信息拼接到一起

3.3.1 outer 外连接

外连接是保留两个表的所有信息,拼接的时候遇到标签不能对齐的部分,用NAN进行填充

pd.merge(df_1,df_2,how='outer')

 3.3.2 left 左连接

左连接是保留所有左表的信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:

pd.merge(df_1,df_2,how='left')

 3.3.3 右连接

 右连接是保留所有右表的信息,把左表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:

pd.merge(df_1,df_2,how='right')

 3.4 lefton & righton 

如果两个DataFrame 没有一列的名字是一样的,我们可以手动指定lefton和righton

比如现在有这样的DataFrame

import pandas as pd
data5=[{'路名': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞','施工与否':True},
     {'路名': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通','施工与否':False},
      {'路名': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞','施工与否':True}]
df_5=pd.DataFrame(data5)
df_5

pd.merge(df_3,df_5,left_on='道路名称',right_on='路名')

3.5 suffixes 

有时候两个表中有好几个相同的列名,除了作为主键的列之外,其他名字相同的列被拼接到表中的时候会有一个后缀表示这个列来自于哪个表格,用于区分名字相同的列

这个后缀默认是(x和y),我们可以使用suffixes来进行手动修改

pd.merge(df_1,df_2,left_index=True,right_index=True,suffixes=['(工作日)','(非工作日)'])

 3.6 indicator

显示拼接后的表中哪些信息来自于哪一个表格

在表的最后就会有一个新列,显示这一条记录来自于在哪表格里有数据,如果两表都有数据会标记both。

pd.merge(df_1,df_2,how='outer',indicator=True)

4 join

在处理索引联接时特别高效

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False, validate=None)
other另一个 DataFrame、Series
on指定按照那一列拼接,默认按照index
how指定联接的方式,默认为 'left'。可选项包括 'left'(左联接),'right'(右联接),'outer'(外联接),'inner'(内联接)
lsuffixrsuffix当两个 DataFrame 中存在重叠的列名时,用来添加到左、右 DataFrame 重叠列名的后缀

参考文献

pandas数据合并之一文弄懂pd.merge() - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值