python数据合并之merge函数

Pandas的merge函数用于合并两个DataFrame对象,支持内连接、外连接、左连接和右连接。参数包括left、right、how、on等,其中how指定了连接方式,on则确定了基于哪些列进行拼接。示例展示了不同连接方式下的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

merge()函数介绍

说明

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

功能:用于合并两个 DataFrame 对象或 Series对象。只能用于两个表的拼接(左右拼接,不能用于上下拼接)
应用场景数据合并 ( 数据合并的另一个常用函数是pd.concat()

参数说明:

left,right
用于拼接的两个表中,即使没有确定谁是主键,函数也会自动将两个表中的重复列作为主键,直接把一个表的名字传递给参数left,另一个表的名字传递给参数right

how
参数拼接方式,默认内连接(‘inner’)
内连接inner:将两个表主键一致的信息拼接到一起
外连接outer:保留两个表的所有信息,如果遇到对不齐的部分,用NAN填充
左连接left:保留左表的全部信息,把右表满足主键的行信息并进来,对不齐的部分用NAN填充
右连接right:保留右表的全部信息(同上)

how=

示例:

import pandas as pd

data1 =pd.DataFrame({'a':['a1','a2','a3'],
                   'b':['b1','b2','b3'],
                   'key':['a','b','c'],
                   'key1':['d','e','f']})
data2 = pd.DataFrame({'c':['c1','c2','c3'],
                      'd':['d1','d2','d3'],
                      'key':['a','b','a'],
                      'key1':['d','e','e']})

result=pd.merge(data1,data2,on = ['key','key1'])
result1=pd.merge(data1,data2,how ="left",on = ['key','key1'])
result2=pd.merge(data1,data2,how ="right",on = ['key','key1'])
result3=pd.merge(data1,data2,how ="inner",on = ['key','key1'])
result4=pd.merge(data1,data2,how ="outer",on = ['key','key1'])
print(data1)
print(data2)
print(result)
print(result1)
print(result2)
print(result3)
print(result4)

运行结果:

    a   b key key1
0  a1  b1   a    d
1  a2  b2   b    e
2  a3  b3   c    f
    c   d key key1
0  c1  d1   a    d
1  c2  d2   b    e
2  c3  d3   a    e
    a   b key key1   c   d
0  a1  b1   a    d  c1  d1
1  a2  b2   b    e  c2  d2
    a   b key key1    c    d
0  a1  b1   a    d   c1   d1
1  a2  b2   b    e   c2   d2
2  a3  b3   c    f  NaN  NaN
     a    b key key1   c   d
0   a1   b1   a    d  c1  d1
1   a2   b2   b    e  c2  d2
2  NaN  NaN   a    e  c3  d3
    a   b key key1   c   d
0  a1  b1   a    d  c1  d1
1  a2  b2   b    e  c2  d2
     a    b key key1    c    d
0   a1   b1   a    d   c1   d1
1   a2   b2   b    e   c2   d2
2   a3   b3   c    f  NaN  NaN
3  NaN  NaN   a    e   c3   d3

Process finished with exit code 0

on
1、确定哪个字段作为主键
2、如果两个表中有两列以上信息相同,可以指定哪一列作为主键,如果不指定,相同信息的列都会作为拼接依据
3、merge()函数默认的是内连接,因此只拼接两表中拥有相同主键信息的行数据。

示例:

import pandas as pd

data1 =pd.DataFrame({'key':['K0','K1','K2','K3'],
                    'A':['A0','A1','A2','A3'],
                    'B':['B0','B1','B2','B3']})
data3= pd.DataFrame({'key':['K0','K1','K2','K3'],})
data2 = pd.DataFrame({'key':['K0','K1','K2','K3'],
                            'C':['C0','C1','C2','C3'],
                            'D':['D0','D1','D2','D3']})
result1 = pd.merge(data1,data3,on = 'key')
result2 = pd.merge(data1,data2,on = 'key')
result3 = pd.merge(data3,data2,on = 'key')
print(data1)
print(data2)
print(data3)
print(result1)
print(result2)
print(result3)

运行结果:

 key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2
3  K3  A3  B3
  key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3
  key
0  K0
1  K1
2  K2
3  K3
  key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2
3  K3  A3  B3
  key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3  C3  D3
  key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3

Process finished with exit code 0

left-index, right-index
1、除指定字段可以作为主键外,索引也可以考虑作为拼接的主键
2、默认为False,即不以索引为主键
3、如果两个表的索引完全一样,直接拼接效果很好,如果索引有不能对齐的地方,在默认的内连接情况下,只会把索引对齐的记录进行拼接

示例:

import pandas as pd

df1 = pd.DataFrame({'lkey': ['foo', 'ba', 'baz', 'fo'],
                    'value': [1, 2, 3, 4]},index=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
                     'value': [5, 6, 7, 8]},index=['A', 'c', 'B', 'h'])
# result1 = pd.merge(df1,df2,left_on ='lkey')
result2 = pd.merge(df1,df2,left_on ='lkey',right_on ='rkey')
result3 = pd.merge(df1,df2,left_on ='lkey',right_on ='rkey',suffixes=("_lf","_rf"))
result4=pd.merge(df1,df2,left_index=True, right_index=True)
#result6=pd.merge(df1,df2,left_index=True)
result5=pd.merge(df1,df2,left_index=True, right_index=True,suffixes=("_lf","_rf"))
print(df1)
print(df2)
# print(result1)
print(result2)
print(result3)
print(result4)
print(result5)
#print(result6)

运行结果:

  lkey  value
A  foo      1
B   ba      2
C  baz      3
D   fo      4
  rkey  value
A  foo      5
c  bar      6
B  baz      7
h  foo      8
  lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  baz        3  baz        7
  lkey  value_lf rkey  value_rf
0  foo         1  foo         5
1  foo         1  foo         8
2  baz         3  baz         7
  lkey  value_x rkey  value_y
A  foo        1  foo        5
B   ba        2  baz        7
  lkey  value_lf rkey  value_rf
A  foo         1  foo         5
B   ba         2  baz         7

Process finished with exit code 0

left_on,right_on
两个表里没有完全一致的列名,但是有信息一致的列
该参数用来指定用来作主键的列名是哪一个
需要保证键值长度相等,len(left_on) == len(right_on)

suffixes
两个表中出现相同的列名,除了作为主键的列之外,其他名字相同的列被拼接到表中的时候会有一个后缀表示这个列来自于哪个表格,用于区分名字相同的列,这个后缀默认是(x和y)。这个后缀是可以自定义修改的

示例:

import pandas as pd

df1 = pd.DataFrame({'lkey': ['foo', 'ba', 'baz', 'fo'],
                    'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
                     'value': [5, 6, 7, 8]})
# result1 = pd.merge(df1,df2,left_on ='lkey')
result2 = pd.merge(df1,df2,left_on ='lkey',right_on ='rkey')
result3 = pd.merge(df1,df2,left_on ='lkey',right_on ='rkey',suffixes=("_lf","_rf"))
print(df1)
print(df2)
# print(result1)
print(result2)
print(result3)

运行结果:

  lkey  value
0  foo      1
1   ba      2
2  baz      3
3   fo      4
  rkey  value
0  foo      5
1  bar      6
2  baz      7
3  foo      8
  lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  baz        3  baz        7
  lkey  value_lf rkey  value_rf
0  foo         1  foo         5
1  foo         1  foo         8
2  baz         3  baz         7

Process finished with exit code 0

indicator
用于显示拼接后的表中信息来自哪个表
在表的最后一列显示left_only /right_only/both
默认False,可以修改为True
示例:

import pandas as pd

data1 =pd.DataFrame({'key':['K','1','K2','K3'],
                     'A':['A0','1','A2','A3'],
                     'B':['B0','B1','B2','B3']})
data2 = pd.DataFrame({'key':['K0','K1','K2','K3'],
                      'C':['C0','C1','C2','C3'],
                      'D':['D0','D1','D2','D3']})
result=pd.merge(data1,data2,how ='outer',on = ['key'],indicator = True)
print(data1)
print(data2)
print(result)

运行结果:

  key   A   B
0   K  A0  B0
1   1   1  B1
2  K2  A2  B2
3  K3  A3  B3
  key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3
  key    A    B    C    D      _merge
0   K   A0   B0  NaN  NaN   left_only
1   1    1   B1  NaN  NaN   left_only
2  K2   A2   B2   C2   D2        both
3  K3   A3   B3   C3   D3        both
4  K0  NaN  NaN   C0   D0  right_only
5  K1  NaN  NaN   C1   D1  right_only

Process finished with exit code 0

参考文件:

https://zhuanlan.zhihu.com/p/340770510

### Merge 的概念与用法 在编程和数据处理领域,“merge” 是指将两个或多个数据集、集合或其他结构组合成一个新的整体的过程。这一操作通常用于保持数据一致性或将不同来源的数据集成到单一视图中。 #### 数据处理中的 Merge数据处理中,`merge` 常见于数据分析工具(如 Pandas 或 SQL)。它涉及通过共同的关键字段连接不同的表或数据框。这种技术类似于数据库查询中的 `JOIN` 操作[^3]。以下是几种常见的 merge 类型: - **Inner Join**: 只保留两组数据中共有的键值对应的记录。 - **Outer Join**: 合并所有记录,无论它们是否存在于另一组数据中。 - **Left Join/Right Join**: 保留左表或右表的所有记录,并补充来自另一侧匹配的记录;如果无匹配,则填充缺失值。 例如,在 Python 中使用 Pandas 库可以实现如下操作: ```python import pandas as pd df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'data1': [1, 2, 3]}) df2 = pd.DataFrame({'key': ['B', 'D', 'E'], 'data2': [4, 5, 6]}) merged_df = pd.merge(df1, df2, on='key', how='inner') print(merged_df) ``` 此代码片段展示了如何基于共享列 `'key'` 执行内部联接[^4]。 #### 并行计算中的 Global Data Aggregation 和 Pairwise Merging 另一种形式的合并发生在分布式系统或者大规模并行运算期间。“Global data aggregation”,即全局数据聚合,是一种有效减少中间状态存储需求的技术。这种方法允许结果逐步累积而不是一次性加载整个数据集进入内存[^2]。具体来说,pairwise merging 将部分结果配对直到最终得出唯一结论。 #### 函数式编程里的 Merge 当提到函数式编程范例时,比如 Haskell 或 Scala,列表或者其他可迭代对象可以通过特定方式融合在一起。一个典型例子就是 zipWith 方法,它可以接受两个序列作为输入参数并将对应位置上的元素传递给指定二元函数来构建新数组[^5]。 ```haskell let mergedList = zipWith (+) [1..5] [6..10] -- Resulting list would be [7,9,11,13,15] ``` 以上实例说明了怎样利用简单的算术加法规则把两个整数系列结合起来形成第三个数值串流。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值