merge into using on 多个字段_Pandas——merge

本文介绍了如何使用Pandas库进行数据融合,详细讲解了通过字段、索引以及不同连接方式进行融合的方法。内容包括:1) 根据字段融合,考虑了字段名一致和不一致的情况;2) 利用索引进行融合;3) 通过inner、outer、left、right四种连接方式进行融合;4) 解决列重叠问题,包括是否添加suffixes。提供了一系列示例代码帮助理解。
摘要由CSDN通过智能技术生成

merge

#导入包
import pandas as pd
import numpy as np
#定义一个类,对融合数据进行显示
class display(object):
    template = """<div style="float: left; padding: 10px;">
    <p style='font-family:"Courier New", Courier, monospace'>{0}</p >{1}
    </div>"""
    def __init__(self, *args):
        self.args = args
        
    def _repr_html_(self):
        return 'n'.join(self.template.format(a, eval(a)._repr_html_())
                         for a in self.args)
    
    def __repr__(self):
        return 'nn'.join(a + 'n' + repr(eval(a))
                           for a in self.args)

1)根据字段来融合

(1)左侧和右侧的相同内容字段名字一致且只有一个相同字段

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
display('df1','df2','pd.merge(df1,df2,on="employee")')  #也可以写成pd.merge(df1,df2)

70bf2d4ff43ce2f10912d4e4c7ccd6cb.png

(2)左侧和右侧的相同内容字段名字不一致

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'salary': [70000, 80000, 120000, 90000]})
display('df1','df3','pd.merge(df1,df3,left_on="employee",right_on="name")')

b476fdd91b578092f40199a06e7040d3.png

1)设置索引

(1)索引相同

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
df1a=df1.set_index('employee')
df2a=df2.set_index('employee')
display('df1a','df2a','pd.merge(df1a,df2a,left_index=True,right_index=True)')

285080ecfa2f4a144fa976c90e27d9ce.png

(2)索引不同

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'salary': [70000, 80000, 120000, 90000]})
df1a=df1.set_index('employee')
df3a=df3.set_index('name')
display('df1a','df3a','pd.merge(df1a,df3a,left_index=True,right_index=True)')

97121441da0a825f82594cb63228cdd7.png

2)根据连接方式

df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'],
                    'food': ['fish', 'beans', 'bread']},
                   columns=['name', 'food'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'],
                    'drink': ['wine', 'beer']},
                   columns=['name', 'drink'])

(1)inner #默认

display('df6','df7','pd.merge(df6,df7,how="inner")')

b6ced5c7c492002411cb1b1a5160a231.png

(2)outer

display('df6','df7','pd.merge(df6,df7,how="outer")')

b22dd90c071256fe401dde35908da4e6.png

(3)left

display('df6','df7','pd.merge(df6,df7,how="left")')

23e6554a1eff884d4e7b2755f8c1254a.png

(4)right

display('df6','df7','pd.merge(df6,df7,how="right")')

74d0beb528fcaa350d86bd0cf1f966fd.png

3)列重叠

(1)未添加suffixes

df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'rank': [3, 1, 4, 2]})
display('df8','df9','pd.merge(df8,df9,on="name")')

b10e67ddccd759b880181accf9e63889.png

(2)添加suffixes

display('df8','df9','pd.merge(df8,df9,on="name",suffixes=["_yuwen","_shuxue"])')

0f62a5f75a45f1d06a5d161a4032fb17.png

总结:

1.字段
(1)左侧和右侧的相同内容字段名字一致且只有一个相同字段
pd.merge(df1,df2)或pd.merge(df1,df2,on='x')
(2)左侧和右侧的相同内容字段名字不一致
pd.merge(df1,df2,left_on='x',right_on='y')
2.索引
不适用列进行融合,可以选择索引进行融合
pd.merge(df1,df2,left_index=True,right_index=True)
3. 不同的融合方式
pd.merge(df1,df2,how='outer|inner|left|right')
4列重叠
pd.merge(df1,df2,on='',suffixes=['_x','_y','_z'])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值