使用DataFrame实现两表连接方式

 更新时间:2023年08月15日 10:39:45   作者:我只是个过路人  
这篇文章主要介绍了使用DataFrame实现两表连接方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

DataFrame实现两表连接

连接查询:包含连接操作的查询称为连接查询

连接查询包含:等值,自然,外连接,内连接,坐连接,自连接……

挖坑坑,深入学习了慢慢填。

pandas的DataFrame的连接不算真正意义的连接查询,只是在两个DataFrame中的操作达到了像连接查询的效果

用pandas库下的DataFram创建DataFrame类型的数据

other = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
                      'B': ['B0', 'B1', 'B2']})
caller = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
                      'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})

假设other是一张表,caller是另一张表,等值连接的SQL查询语句可以表示为

select other.*,caller*
from other,caller
where other.Key=caller.key

用pandas.DataFrame.join实现相同的效果

caller.join(other.set_index('key'),on='key',how='left').dropna() 

用pd.merge实现

pd.merge(left=caller, right=other, how='left', left_on='key', right_on='key'
,left_index=True,right_index=True)

pd.merge(left=caller, right=other, how='inner', left_on='key', right_on='key',left_index=True,right_index=True)

pandas中DataFrame表连接操作,及merge与join区别

为了方便维护,一般公司的数据在数据库内都是分表存储的,比如用一个表存储所有用户的基本信息,一个表存储用户的消费情况。    

所以,在日常的数据处理中,经常需要将两张表拼接起来使用,这样的操作对应到SQL中是join,在Pandas中则是用merge来实现。    

上面的引入部分说到merge是用来拼接两张表的,那么拼接时自然就需要将用户信息一一对应地进行拼接。    

所以进行拼接的两张表需要有一个共同的识别用户的键(key),也就是on参数所指定的列。

总结来说,整个merge的过程就是将信息一一对应匹配的过程,下面介绍merge的四种类型,分别为'inner'、'left'、'right'和'outer'。

merge参数讲解

merge(
    left,            # 左表
    right,           # 右表
    how="inner",     # 连接方式,inner、left、right、outer,默认为inner
    on=None,
    """
    on: 用于连接的列名称
    指定合并时用于连接(外连,内连,左连,右连)的列。
    默认为None,merge()方法自动识别两个DataFrame中名字相同的列,作为连接的列。
    on参数指定的列必须在两个被合并DataFrame中都有,否则会报错。
    on参数也可以指定多列,合并时按多个列进行连接。在合并时,只有多个列的值同时相等,两个DataFrame才会匹配上。
    """
    left_on,         # 左表用于连接的列名
    right_on,        # 右表用于连接的列名
    """
    使用on参数时,指定的列必须在两个DataFrame中都有。
    merge()方法也支持两个DataFrame分别指定连接的列,此时不要求指定列在两个DataFrame中都有。
    当left_on和right_on都指定一样的列时,与用on参数的结果一样。
    """
    left_index,      # 是否使用左表的行索引作为连接键,默认False
    right_index,     # 是否使用右表的行索引作为连接键,默认False
    sort,            # 默认为False,将合并的数据进行排序
    copy,            # 默认为True,总是将数据复制到数据结构中,设置为False可以提高性能
    suffixes,        # 存在相同列名时在列名后面添加的后缀,默认为('_x', ‘_y')
    indicator,       # 显示合并数据中数据来自哪个表
    validate=None,
    """
    validate: 用于指定两个DataFrame连接列的对应关系。
    有one_to_one(一对一),one_to_many(一对多),many_to_one(多对一),many_to_many(多对多)四种对应方式。
    默认为None,merge()方法自动根据两个DataFrame的连接列采用适合的对应方式。
    """
)

创建两个DataFrame

dishes_info = pd.read_csv("./dishes_info.csv")
order_sample = pd.read_csv("./order_sample.csv")
print(dishes_info)
print(order_sample)

dishes_info:

order_sample:

我们使用merge方法将两表根据dishes_id列连接起来,使用左连接的方式

data = pd.merge(dishes_info, order_sample, on="dishes_id", how="left")

新表data数据如下

以上是常用的方式,根据两表都具有的列(相同列名,相同类型)进行表连接。

有的时候,合并操作不是用DataFrame的列,而是用索引作为键。把left_index和right_index选项的值置为True,就可将其作为合并DataFrame的基准。

data = pd.merge(dishes_info, order_sample, how="left", left_index=True, right_index=True)

生成的data数据如下:

此文章对这两表进行以索引为基准的连接操作,没有意义,这两表就不是这样连的(有意义的连接应该是根据dishes_id进行连接),主要就是硬解释一下left_index和right_index选项的作用。

pandas中join函数的使用方式

join(
    other,            # DataFrame, Series, or list of DataFrame,另外一个dataframe, series,或者dataframe list。
    on=None,          # 参与join的列,与sql中的on参数类似。
    how=“left”,       # how: {‘left', ‘right', ‘outer', ‘inner'}, default ‘left', 与sql中的join方式类似。
    lsuffix="",       #  lsuffix: 左DataFrame中重复列的后缀
    rsuffix="",       # rsuffix: 右DataFrame中重复列的后缀
    sort=False        # 默认为False,将合并的数据进行排序
)
  • DataFrame对象的join()函数就像是merge()函数的left_index & right_index 为 True。
  • DataFrame对象的join()函数更适合于根据索引进行合并,我们可以用它合并多个索引相同列不同的DataFrame对象。

以下是我根据行索引进行连接,报错显示有相同的列,就是两表都有dishes_id这列,但是我没有修改

data = dishes_info.join(order_sample)         # 会报错,原因就是因为有重复的列名
# 以下为错误信息
"""
dishes_id
ValueError                                Traceback (most recent call last)
<ipython-input-18-8bc025c8fee6> in <module>()
      1 # DataFrame对象的join()函数就像是merge()函数的left_index & right_index 为 True
      2 # DataFrame对象的join()函数更适合于根据索引进行合并,我们可以用它合并多个索引相同列不同的DataFrame对象。
----> 3 data = dishes_info.join(order_sample)         # 会报错,原因就是因为有重复的列名dishes_id
      4 # 由于join默认根据行索引进行连接,所以我们修改两表的行索引为dishes_id列在进行连接
      5 # dishes_info.set_index("dishes_id", inplace=True)     # 该函数默认不修改原数据,需要inplace配置项指定为True才保存修改
D:\Destination\lib\site-packages\pandas\core\frame.py in join(self, other, on, how, lsuffix, rsuffix, sort)
   6334         # For SparseDataFrame's benefit
   6335         return self._join_compat(other, on=on, how=how, lsuffix=lsuffix,
-> 6336                                  rsuffix=rsuffix, sort=sort)
   6337 
   6338     def _join_compat(self, other, on=None, how='left', lsuffix='', rsuffix='',
D:\Destination\lib\site-packages\pandas\core\frame.py in _join_compat(self, other, on, how, lsuffix, rsuffix, sort)
   6349             return merge(self, other, left_on=on, how=how,
   6350                          left_index=on is None, right_index=True,
-> 6351                          suffixes=(lsuffix, rsuffix), sort=sort)
   6352         else:
   6353             if on is not None:
D:\Destination\lib\site-packages\pandas\core\reshape\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
     60                          copy=copy, indicator=indicator,
     61                          validate=validate)
---> 62     return op.get_result()
     63 
     64 
D:\Destination\lib\site-packages\pandas\core\reshape\merge.py in get_result(self)
    572 
    573         llabels, rlabels = items_overlap_with_suffix(ldata.items, lsuf,
--> 574                                                      rdata.items, rsuf)
    575 
    576         lindexers = {1: left_indexer} if left_indexer is not None else {}
D:\Destination\lib\site-packages\pandas\core\internals.py in items_overlap_with_suffix(left, lsuffix, right, rsuffix)
   5242         if not lsuffix and not rsuffix:
   5243             raise ValueError('columns overlap but no suffix specified: '
-> 5244                              '{rename}'.format(rename=to_rename))
   5245 
   5246         def lrenamer(x):
ValueError: columns overlap but no suffix specified: Index(['dishes_id'], dtype='object')
"""

我们对join正确的用法:

由于join默认根据行索引进行连接,所以我们修改两表的行索引为dishes_id列在进行连接

dishes_info.set_index("dishes_id", inplace=True)     # 该函数默认不修改原数据,需要inplace配置项指定为True才保存修改
order_sample.set_index("dishes_id", inplace=True)

dishes_info数据:

order_sample数据:

修改完成后对两表进行根据行索引作为基准的表连接

data = dishes_info.join(order_sample)

生成data表的数据

如上所示,join合并操作默认是以行索引而不是以列为基准。

Join函数有on参数,如果指定了,那就表示join连接以行索引并且以on指定的列联合作为键进行表连接。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解centos7+django+python3+mysql+阿里云部署项目全流程

    详解centos7+django+python3+mysql+阿里云部署项目全流程

    这篇文章主要介绍了详解centos7+django+python3+mysql+阿里云部署项目全流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python上下文管理器with块及@contextmanager的使用

    Python上下文管理器with块及@contextmanager的使用

    本文主要介绍了上下文管理器和with块的知识,包括上下文管理器的作用、接口以及__enter__和__exit__方法的用法,同时,还介绍了@contextmanager的用法,它可以简化上下文管理器的创建过程
    2026-04-04
  • python将list转为matrix的方法

    python将list转为matrix的方法

    今天小编就为大家分享一篇python将list转为matrix的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python局部赋值的规则

    python局部赋值的规则

    Python提出如下假设:如果在函数体内的任何地方对变量赋值,则Python将名称添加到局部命名空间中。
    2013-03-03
  • Python实现的简单模板引擎功能示例

    Python实现的简单模板引擎功能示例

    这篇文章主要介绍了Python实现的简单模板引擎功能,结合具体实例形式分析了Python模版引擎的定义与使用方法,需要的朋友可以参考下
    2017-09-09
  • Python实用库 PrettyTable 学习笔记

    Python实用库 PrettyTable 学习笔记

    这篇文章主要介绍了Python实用库 PrettyTable 学习笔记,结合实例形式分析了Python表格操作库PrettyTable的安装、使用技巧与相关注意事项,需要的朋友可以参考下
    2019-08-08
  • Python实现从log日志中提取ip的方法【正则提取】

    Python实现从log日志中提取ip的方法【正则提取】

    这篇文章主要介绍了Python实现从log日志中提取ip的方法,涉及Python文件读取、数据遍历、正则匹配等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • Python自动化开发学习之三级菜单制作

    Python自动化开发学习之三级菜单制作

    这篇文章主要为大家详细介绍了Python自动化开发学习之三级菜单的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • MacOS(M1芯片 arm架构)下安装PyTorch的详细过程

    MacOS(M1芯片 arm架构)下安装PyTorch的详细过程

    这篇文章主要介绍了MacOS(M1芯片 arm架构)下安装PyTorch的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 使用Python+Bright Data MCP实时抓取Google搜索结果完整教程

    使用Python+Bright Data MCP实时抓取Google搜索结果完整教程

    在 AI 应用和智能代理(Agent)的开发中,实时性数据往往是决定效果的关键,但传统的网页数据获取方式存在明显痛点,而 Bright Data 的 Web MCP Server正好可以解决这些问题,本文就给大家介绍了使用Python+Bright Data MCP实时抓取Google搜索结果完整教程
    2025-08-08

最新评论