pandas的拼接操作 --- pandas.merge()合并

pandas的拼接操作

使用pd.merge()合并

merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并,使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意:每一列元素的顺序不要求一致

1、一对一合并

# 导入库,别名
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 定义生成DataFrame的函数
def make_df(cols,index):
    data = {col:[str(col)+str(ind) for ind in index] for col in cols}
    df = DataFrame(data = data,columns = cols ,index = index )   
    return df
df1 = make_df(['a','b','c'],[1,2,3])
# 输出
    a   b   c
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3
df2 = make_df(['a','b','c'],[4,5,6])
# 输出
     a  b   c
4   a4  b4  c4
5   a5  b5  c5
6   a6  b6  c6
pd.merge(df1,df2)  #默认是内连接,表的两数据都不对应
# 输出
    a   b   c
pd.merge(df1,df2,how='right')
# 输出
    a   b   c
0   a4  b4  c4
1   a5  b5  c5
2   a6  b6  c6
df5 = make_df(['c','d','e'],[3,4,5])
# 输出
    c   d   e
3   c3  d3  e3
4   c4  d4  e4
5   c5  d5  e5
pd.merge(df1,df5)
# 输出
    a   b   c   d   e
0   a3  b3  c3  d3  e3
pd.merge(df1,df5,how='left')
# 输出
    a   b   c   d   e
0   a1  b1  c1  NaN NaN
1   a2  b2  c2  NaN NaN
2   a3  b3  c3  d3  e3
pd.merge(df1,df5,how='right')
# 输出
    a   b   c   d   e
0   a3  b3  c3  d3  e3
1   NaN NaN c4  d4  e4
2   NaN NaN c5  d5  e5

2、多对一|一对多合并

df1 = make_df(['a','b','c'],[1,2,3])
# 输出
    a   b   c
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3
df8 = make_df(['c','d','e'],[1,1,1,4])
# 输出
     c   d   e
1   c1  d1  e1
1   c1  d1  e1
1   c1  d1  e1
4   c4  d4  e4
pd.merge(df1,df8)
# 输出
    a   b   c   d   e
0   a1  b1  c1  d1  e1
1   a1  b1  c1  d1  e1
2   a1  b1  c1  d1  e1
pd.merge(df1,df8,how='left')
# 输出
     a   b   c   d   e
0   a1  b1  c1  d1  e1
1   a1  b1  c1  d1  e1
2   a1  b1  c1  d1  e1
3   a2  b2  c2  NaN NaN
4   a3  b3  c3  NaN NaN
pd.merge(df1,df8,how='right')
# 输出
    a   b   c   d   e
0   a1  b1  c1  d1  e1
1   a1  b1  c1  d1  e1
2   a1  b1  c1  d1  e1
3   NaN NaN c4  d4  e4
pd.merge(df1,df8,how='outer')
# 输出
    a   b   c   d   e
0   a1  b1  c1  d1  e1
1   a1  b1  c1  d1  e1
2   a1  b1  c1  d1  e1
3   a2  b2  c2  NaN NaN
4   a3  b3  c3  NaN NaN
5   NaN NaN c4  d4  e4

3、 多对多合并

df8 = make_df(['c','d','e'],[1,1,1,4])
# 输出
     c   d   e
1   c1  d1  e1
1   c1  d1  e1
1   c1  d1  e1
4   c4  d4  e4
df8.iloc[0]['d'] = 'qwe'
# 输出
    c   d   e
1   c1  qwe e1
1   c1  d1  e1
1   c1  d1  e1
4   c4  d4  asd
df8['e'][4] = 'asd'
# 输出
    c   d   e
1   c1  qwe e1
1   c1  d1  e1
1   c1  d1  e1
4   c4  d4  asd
df9 = make_df(list('abc'),[1,1,4])
# 输出
    a   b   c
1   a1  b1  c1
1   a1  b1  c1
4   a4  b4  c4
pd.merge(df9,df8,how='outer')
# 输出
    a   b   c   d   e
0   a1  b1  c1  qwe e1
1   a1  b1  c1  d1  e1
2   a1  b1  c1  d1  e1
3   a1  b1  c1  qwe e1
4   a1  b1  c1  d1  e1
5   a1  b1  c1  d1  e1
6   a4  b4  c4  d4  asd

4、key的规范化

使用on=显式指定某列为key,当有多个key相同时使用

df1 = make_df(['a','b','c'],[1,2,3])
# 输出
    a   b   c
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3
df10 = make_df(list('cde'),[1,2,3])
df10.columns = list('wde')
# 输出
    w   d   e
1   c1  d1  e1
2   c2  d2  e2
3   c3  d3  e3
#on的作用是将两个表中相同数据类型,含义一致的字段进行连接的
pd.merge(df1,df10,left_on='c',right_on='w')
# 输出
    a   b   c   w   d   e
0   a1  b1  c1  c1  d1  e1
1   a2  b2  c2  c2  d2  e2
2   a3  b3  c3  c3  d3  e3
df11 = make_df(list('bcd'),[1,2,3])
# 输出
    b   c   d
1   b1  c1  d1
2   b2  c2  d2
3   b3  c3  d3
pd.merge(df1,df11,on='b')
# 输出
    a   b   c_x c_y d
0   a1  b1  c1  c1  d1
1   a2  b2  c2  c2  d2
2   a3  b3  c3  c3  d3
pd.merge(df1,df11,on='c')
    a   b_x c   b_y d
0   a1  b1  c1  b1  d1
1   a2  b2  c2  b2  d2
2   a3  b3  c3  b3  d3

5、列冲突的解决

当列冲突时,即有多个列名称相同时,需要使用on=来指定某个列作为key,配合suffixes指定冲突列名,可以使用suffixes=自己指定后缀。

df1 = make_df(['a','b','c'],[1,2,3])
# 输出
    a   b   c
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3
df11 = make_df(list('bcd'),[1,2,3])
# 输出
    b   c   d
1   b1  c1  d1
2   b2  c2  d2
3   b3  c3  d3
pd.merge(df1,df11,on='c',suffixes=('_up','_down'))
# 输出
    a   b_up    c   b_down  d
0   a1  b1      c1  b1      d1
1   a2  b2      c2  b2      d2
2   a3  b3      c3  b3      d3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值