技术标签: 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数据读写。
如下所示,首先定义两个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的其他列。
在上面例子中,没有为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_on
和right_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_index
和right_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 用法
文章浏览阅读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次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。
文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计
文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高
文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏
文章浏览阅读2.8k次。#.简介: WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。WebView内部的WebSetting对象负责管理WebView的参数配置; WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调; ChromeWebviewClient辅助Webview处理与JS一些交互......_android webview真正加载完成
文章浏览阅读1.6k次。_bitcoin 调试环境搭建
文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成
文章浏览阅读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
文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath
文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰
文章浏览阅读7.3k次。假设表格有A、B、C、D四列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3、col4。_excel数据怎么生成sql语句