Pandas 合并(merge)_pandas中merge相同列按第一个为准-程序员宅基地

技术标签: pandas  pandas merge  pandas合并  

Pandas 合并(merge),对于合并操作,熟悉SQL的同学可以将其理解为JOIN操作,它使用一个或多个键把多行数据结合在一起。

原文参考 https://coolcou.com/pandas/pandas-data-process/pandas-merger-merge.html

跟关系数据库打交道的同学通常使用SQL的JOIN查询,用几个表共用的引用值(键)从不同的表获取数据。以这些键为基础,我们能够获取列表形式的新数据,这些数据是对几个表中的数据进行组合得到的。Pandas库中这类操作叫做合并,执行合并操作的函数为merge()

阅读本章内容前,可以先学习Pandas基础教程Pandas数据读写

使用merge()函数进行合并

如下所示,首先定义两个DataFrame对象,然后对两个DataFrame对象应用merge()函数进行合并操作。

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'price':['12.33', '11.44', '33.21', '12.23', '33.62']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'color':['white', 'red', 'red', 'black']})
print(frame1)
print('------------')
print(frame2)
print('-----------')
print(pd.merge(frame1, frame2))

输出结果如下:
在这里插入图片描述
如上所示,返回的DataFrame对象由原来两个DataFrame对象中ID相同的行组成,出了id这一列,新DataFrame包含了属于两个DataFrame的其他列。

on 选项指定基准列

在上面例子中,没有为merge()指定基于哪一列进行合并,实际应用中,常常需要指定基于哪一列进行合并。具体做法是增加on选项,把列的名称作为用于合并的键赋值给它。如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
print(frame1)
print('------------')
print(frame2)
print('-----------')
print(pd.merge(frame1, frame2))

输出结果如下:
在这里插入图片描述

如上所示,由于我们定义的两个DataFrame对象,一个对象的列名称在另一个对象中也存在,所以对它们执行合并操作将得到一个空DataFrame对象。

因此我们需要明确定义pandas合并操作需要遵循的标准,我们用on选项指定合并操作所依据的基准列,合并标准不同,合并结果也会不同,如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
print(pd.merge(frame1, frame2,on='id'))
print("------------")
print(pd.merge(frame1, frame2,on='brand'))

输出结果如下:
在这里插入图片描述

问题如影随形,假如两个DataFrame基准列的名称不一致,又该如何进行合并呢?为此,我们可以使用left_onright_on选项指定第一个和第二个DataFrame的基准列,如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand', 'sid']
print(frame1)
print('------------')
print(frame2)
print('------------')
print(pd.merge(frame1,frame2,left_on='id',right_on='sid'))

输出结果如下:
在这里插入图片描述

左连接,右连接,外连接

如上所示,merge()函数默认执行的是内连接操作,上述结果执行的是交叉操作,其他还支持左连接右连接外连接外连接把所有的键整合在一起,其效果相当于左连接右连接的效果之和,连接类型用how选项指定。如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand', 'id']
print(frame1)
print('------------')
print(frame2)
print('------------')
print(pd.merge(frame1,frame2,on='id'))

执行结果如下:
在这里插入图片描述
分别执行外连接左连接右连接,如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand', 'id']
print(pd.merge(frame1,frame2,how='outer'))
print('------------')
print(pd.merge(frame1,frame2,how='left'))
print('------------')
print(pd.merge(frame1,frame2,how='right'))

输出结果如下:

  brand  color       id
0   OMG  white     ball
1   ABC    red   pencil
2   ABC    red      pen
3   POD  black      mug
4   POD  green  ashtray
5   OMG    NaN   pencil
6   POD    NaN   pencil
7   ABC    NaN     ball
8   POD    NaN      pen
------------
  brand  color       id
0   OMG  white     ball
1   ABC    red   pencil
2   ABC    red      pen
3   POD  black      mug
4   POD  green  ashtray
------------
  brand color      id
0   OMG   NaN  pencil
1   POD   NaN  pencil
2   ABC   NaN    ball
3   POD   NaN     pen

要合并多个键,则把多个键赋值为on选项,如下示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand', 'id']
print(pd.merge(frame1,frame2,on=['id','brand'],how='outer'))

输出结果如下:
在这里插入图片描述

根据索引进行合并

有的时候,合并操作不是用DataFrame的列,而是用索引作为键。把left_indexright_index选项的值置为True,就可将其作为合并DataFrame的基准。如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand', 'id']
print(pd.merge(frame1,frame2,right_index=True,left_index=True))

输出结果如下:
在这里插入图片描述

DataFrame对象的join()函数更适合于根据索引进行合并,我们可以用它合并多个索引相同列不同的DataFrame对象。如上所示,因为frame1的列名称和frame2的列名称有重合,直接调用frame1.join(frame2)会给出错误信息,这里要重命名frame2的列。如下所示:

import pandas as pd

frame1 = pd.DataFrame({
    'id':['ball', 'pencil', 'pen', 'mug', 'ashtray'],
                       'color':['white', 'red', 'red', 'black','green'],
                       'brand':['OMG', 'ABC', 'ABC', 'POD', 'POD']})
frame2 = pd.DataFrame({
    'id':['pencil', 'pencil', 'ball', 'pen'],
                       'brand':['OMG', 'POD', 'ABC', 'POD']})
frame2.columns = ['brand2', 'id2']
print(frame1.join(frame2))

输出结果如下:
在这里插入图片描述

如上所示,合并操作是以索引而不是列为基准,合并后得到的DataFrame对象包含了只存在于frame1的索引4,整合了frame2,索引为4的各元素使用NaN填充。

相关文章参考
Pandas 旋转数据
Pandas 删除数据
Pandas 拼接(concat)
Pandas GroupBy 用法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xia1984920/article/details/102864527

智能推荐

240320俄罗斯方块java,JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_2-程序员宅基地

文章浏览阅读202次。packagecode;//importjava.awt.*;//importjava.awt.Canvas;//importjava.awt.event.*;//importjavax.swing.*;importjava.util.Random;importjavax.microedition.lcdui.*;//写界面所需要的包/***//***俄罗斯方块*高雷*2007年1..._240×320java游戏

在线电影院售票平台(源码+开题报告)-程序员宅基地

文章浏览阅读779次,点赞14次,收藏19次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。

程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统!_基于c++的即时聊天系统设计-程序员宅基地

文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计

linux Java服务swap分区被占用内存泄露问题故障及解决方法_linux swap占用很高-程序员宅基地

文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高

word中利用宏替换标点标点全角与半角-程序员宅基地

文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏

Android WebView使用总结_android webview真正加载完成-程序员宅基地

文章浏览阅读2.8k次。#.简介: WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。WebView内部的WebSetting对象负责管理WebView的参数配置; WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调; ChromeWebviewClient辅助Webview处理与JS一些交互......_android webview真正加载完成

随便推点

bitcoin 调试环境搭建-程序员宅基地

文章浏览阅读1.6k次。_bitcoin 调试环境搭建

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)-程序员宅基地

文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成

CDH安装宝典之ClouderaManager_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line -程序员宅基地

文章浏览阅读902次。配置本地repo库下载我的阿里云盘文件文件放置#创建目录mkdir -p /opt/cloudera/parcel-repo/mkdir -p /opt/cloudera/cm/yum install createrepoCDH 6.2.0 的三个文件放到/opt/cloudera/parcel-repo/中,并且注意把sha256后缀的文件名修改为sha#执行createrepo命令生成rpm元数据 最终/opt/cloudera/parcel-repo/会多一个repodata目录_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line 76: /usr/java/jdk1.8.0_181

uni.canvasToTempFilePath在app正常,微信小程序报错: fail canvas is empty-程序员宅基地

文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath

SDRAM笔记_sdram 干扰-程序员宅基地

文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰

Excel转SQL语句_excel数据怎么生成sql语句-程序员宅基地

文章浏览阅读7.3k次。假设表格有A、B、C、D四列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3、col4。_excel数据怎么生成sql语句

推荐文章

热门文章

相关标签