首页 > pandas 阅读数:40

pandas按键连接数据(merge()和join())

在数据采集时,往往会将数据分散存储于不同的数据集中。而在数据分析时,常常又需要通过一个或多个键将两个数据集的行连接起来,或者沿着一条轴将多个数据堆叠到一起,以实现数据合并操作。

数据合并操作类似于数据库中运用SQL语句的JOIN连接来实现多表查询。通过数据合并,可以将多个数据集整合到一个数据集中。在 pandas 中,常用的数据合并函数有 merge()、join()、concat()、append() 和 combine_first()。本节教程就来介绍前 2 个函数,它能将两个数据集的行连接起来。

merge() 函数

在 pandas 中,通过两个数据集中一个或多个键来合并数据时,可使用 merge() 函数,该函数的语法格式如下:

pandas.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)

函数中的参数说明如下:
  • left:参与合并的左侧 DataFrame;
  • right:参与合并的右侧 DataFrame;
  • how:表示连接方式,取值{inner,outer,left,right}:
    • 默认为 inner 内连接,其结果是取两个数据集中键值交集的数据;
    • outer 外连接,其结果是取两个数据集中键值并集的数据,对不匹配的键所对应的数据用 NaN 填充;
    • left 左连接,取左侧全部数据,右侧取与左侧相匹配的键所对应的数据,不匹配的键所对应的数据用 NaN 填充;
    • right 右连接,取右侧全部数据,左侧取与右侧相匹配的键所对应的数据,不匹配的键所对应的数据用 NaN 填充。
  • on:表示用于连接的列名,必须同时存在于左右两个 DataFrame 对象中,如果未传递且 left_index 和 right_index 为 False,则 DataFrame 中列的交集将作为连接键;
  • left_on:表示左侧 DataFarme 中用作连接键的列,可以是列名、索引级名称,也可以是长度等于 DataFrame 长度的数组;
  • right_on:表示右侧 DataFarme 中用作连接键的列,可以是列名、索引级名称,也可以是长度等于 DataFrame 长度的数组;
  • left_index:如果为 True,则使用左侧 DataFrame 中的索引(行标签)作为其连接键;
  • right_index:如果为 True,则使用右侧 DataFrame 中的索引(行标签)作为其连接键;
  • sort:如果为 True,则将合并的数据进行排序,默认为 False,在大多数情况下设置为 False 可以提高性能;
  • suffixes:字符串值组成的元组,用于指定当左右 DataFrame 存在相同列名时,在列名后面附加的后缀名称,默认为('_x','_y'),例如,左右两个 DataFrame 对象都有 'data',则结果中就会出现 'data_x' 和 'data_y';
  • copy:默认为 True,表示总是将数据复制到数据结构中,大多数情况下设置为 False 可以提高性能;
  • indicator:默认为 False,如果设置为 True,将显示合并数据中每行来源的信息添加到名为 _merge 的列中输出,例如,只来自左边 (left_only)、两者(both)、只来自右边 (right_only)。

【例 1】创建产品信息(info)和产品销售(sale)数据集,并完成下列对产品信息和产品销售数据集的数据合并操作。
  1. 使用默认连接方式连接产品信息和产品销售数据集。
  2. 按照指定“产品编号”列名合并产品信息和产品销售数据集。
  3. 分别用 left、right、outer 连接方式连接数据集。
  4. 根据“产品编号”和“品牌”多个键进行连接。
  5. 对重复的列名处理。
  6. 将索引作为连接的键。

其示例代码 test1.py 如下。
# -*- coding: utf-8 -*-
import pandas as pd
#创建产品信息(info)和产品销售(sale)数据集
info = pd.DataFrame({'产品编号':list('ABCD'),'类型名称':['电视机',
                     '手机','电脑','空调'],'品牌':['格力','康佳',
                     '海信','TCL']},index=range(1001,1005))
info.columns.name='产品信息'
info.index.name='编号'
print(info)
sale = pd.DataFrame({'产品编号':list('ABECDF'),'品牌':['格力',
                     '康佳','海信','TCL','康佳','格力'],'价格'
                     :[3600,1500,4500,2000,2300,3500]},index=
                     range(1001,1007))
sale.columns.name='产品销售'
sale.index.name='编号'
print(sale)

#1.使用默认连接方式连接产品信息和产品销售数据集
print(pd.merge(info,sale))
#2.按照指定"产品编号"列名合并产品信息和产品销售数据集
print(pd.merge(info,sale,on='产品编号'))
#3.分别用left、right、outer连接方式连接数据集
print(pd.merge(info,sale,how='left'))
print(pd.merge(info,sale,how='right'))
print(pd.merge(info,sale,how='outer') )

#4.根据"产品编号"和"品牌"多个键进行连接
print(pd.merge(info,sale,on=['产品编号','品牌']))
#5.对重复的列名进行处理
print(pd.merge(info,sale,on='产品编号',suffixes=('_1','_2')))
#6.将索引作为连接的键
print(pd.merge(info,sale,on=['产品编号','品牌],left_index=True,
               right_index=True ))

join() 函数

除了 merge() 函数外,还可以使用 join() 函数来实现根据特定的列和索引进行合并数据的操作。join() 函数默认是通过 index 进行连接的,也可以通过设置参数“on”来指定连接的列。

join() 函数的语法格式如下:

left.join(right,on='keys')

函数功能:将 left 的 'keys' 列和 right 的索引作为关键字进行比较,相同的进行合并。其等效于 pandas.merge(left,right,left_on='key',right_index=True,how='left')。

示例代码 example2.py 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
left = pd.DataFrame({'one':np.arange(4),'two':list('abcd'),
                     'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'three':[4,5],'four': ['e', 'f']},
                     index=['K0', 'K1'])
result = left.join(right, on='key')
print(left,'\n',right,'\n',result)

运行输出结果如下。
  one two key
0    0   a  K0
1    1   b  K1
2    2   c  K0
3    3   d  K1
     three four
K0      4    e
K1      5    f
    one two key  three four
0    0   a  K0    4    e
1    1   b  K1    5    f
2    2   c  K0    4    e
3    3   d  K1    5    f