10-Pandas之数据融合(pd.merge()、df.join()、df.combine_first()详解)
一、pd.merge()
参数 | 说明 |
left | 参与合并的左侧DataFrame |
right | 参与合并的右侧DataFrame |
how |
如何合并。值为{'left','right','outer','inner'},默认为'inner' left: 仅保留左侧DataFrame中存在的键 right:仅保留右侧DataFrame中存在的键 outer:保留左右DataFrame键的交集 inner:保留左右DataFrame键的并集 |
on | 用于连接的列名,默认是两个DataFrame重叠的列 |
left_on | 左侧DataFrame中用作连接键的列 |
right_on | 右侧DataFrame中用作连接键的列 |
left_index | {True,False},将左侧的行索引用作其连接键 |
right_index | {True,False},将右侧的行做引用作其连接键 |
suffixes | 字符串值元组,用于追加到重叠列名的后缀,默认为('_x','_y') |
(1)先创建两个DataFrame
>>> left = pd.DataFrame({'姓名':['张某','李某','段某'],'年龄':[22,26,24]})
>>> left
姓名 年龄
0 张某 22
1 李某 26
2 段某 24 >>> right = pd.DataFrame({'姓名':['张某','李某','钱某'],'籍贯':['北京','河北','江苏']})
>>> right
姓名 籍贯
0 张某 北京
1 李某 河北
2 钱某 江苏
(2)在默认情况下,将重叠列当做键,也可通过参数on指定;
>>> pd.merge(left,right)
姓名 年龄 籍贯
0 张某 22 北京
1 李某 26 河北 #通过参数on指定
>>> pd.merge(left,right,on='姓名')
姓名 年龄 籍贯
0 张某 22 北京
1 李某 26 河北
(3)融合指标变量indicator,设置indicator的值为True,则融合结果中将增加列名为"_merge"的一列,其值代表不同含义:
取值 | 说明 |
left_only | 融合的键仅在左侧的DataFrame中存在 |
right_only | 融合的键仅在右侧的DataFrame中存在 |
both | 融合的键在左右两侧的DataFrame中均存在 |
>>> pd.merge(left,right,on='姓名',how='outer',indicator=True)
姓名 年龄 籍贯 _merge
0 张某 22.0 北京 both
1 李某 26.0 河北 both
2 段某 24.0 NaN left_only
3 钱某 NaN 江苏 right_only
indicator也可以接受字符串,生成的指标列的列名将由”_merge“变为该字符串:
>>> pd.merge(left,right,on='姓名',how='outer',indicator='indicator_column')
姓名 年龄 籍贯 indicator_column
0 张某 22.0 北京 both
1 李某 26.0 河北 both
2 段某 24.0 NaN left_only
3 钱某 NaN 江苏 right_only
(4)索引与列进行融合
注:left的索引和right中的某一列均为“姓名”,现在需要根据姓名进行融合
>>> left = pd.DataFrame({'年龄':[22,26,24]},index=['张某','李某','段某'])
>>> left
年龄
张某 22
李某 26
段某 24
>>> left.index.name='姓名'
>>> left
年龄
姓名
张某 22
李某 26
段某 24 >>> right = pd.DataFrame({'姓名':['张某','李某','钱某'],'籍贯':['北京','河北','江苏']})
>>> right
姓名 籍贯
0 张某 北京
1 李某 河北
2 钱某 江苏 #其中,left的索引和right中的某一列均为“姓名”,现在需要根据姓名进行融合
>>> pd.merge(left,right,how='outer',left_index=True,right_on='姓名')
年龄 姓名 籍贯
0 22.0 张某 北京
1 26.0 李某 河北
2 24.0 段某 NaN
2 NaN 钱某 江苏
(5)索引与索引的融合
left和right的索引均为‘姓名’,现进行融合
>>> left = pd.DataFrame({'年龄':[22,26,24]},index=['张某','李某','段某'])
>>> left.index.name='姓名'
>>> right = pd.DataFrame({'籍贯':['北京','河北','江苏']},index=['张某','李某','钱某'])
>>> right.index.name='姓名'
>>> left
年龄
姓名
张某 22
李某 26
段某 24
>>> right
籍贯
姓名
张某 北京
李某 河北
钱某 江苏 #left和right的索引均为‘姓名’,现进行融合
>>> pd.merge(left,right,how='outer',left_index=True,right_index=True)
年龄 籍贯
姓名
张某 22.0 北京
李某 26.0 河北
段某 24.0 NaN
钱某 NaN 江苏
二、join()
join()函数相对于pd.merge()而言是一种更为简便的实现方式
(1)对于索引与列的融合,需要设置on参数,来指明左键
注意:此时on的值应该是具体的列,而不是索引,索引此时的实体(即join左边的对象应该是包含“姓名”列的DataFrame)
>>> left
年龄
姓名
张某 22
李某 26
段某 24
>>> right
姓名 籍贯
0 张某 北京
1 李某 河北
2 钱某 江苏 #注意:此时on的值应该是具体的列,而不是索引,索引此时的实体(即join左边的对象应该是包含“姓名”列的DataFrame)
>>> right.join(left,on='姓名')
姓名 籍贯 年龄
0 张某 北京 22.0
1 李某 河北 26.0
2 钱某 江苏 NaN
(2)索引与索引的融合
相当于>>>pd.merge(left,right,how='outer',left_index=True,right_on='姓名')
>>> left
年龄
姓名
张某 22
李某 26
段某 24
>>> right
籍贯
姓名
张某 北京
李某 河北
钱某 江苏 >>> left.join(right,how='outer')
年龄 籍贯
姓名
张某 22.0 北京
李某 26.0 河北
段某 24.0 NaN
钱某 NaN 江苏
三、combine_first()
由于数据融合是有一种常见的现象,即:需要根据一个DataFrame对象中的值为另一个DataFrame中的值做缺失值处理;
于是combine_first()应运而生,该方法实现了用参数对象中的数据为调用者对象的缺失数据“打补丁”,且会自动对其索引。
>>> left = pd.DataFrame({'姓名':['张某','李某','段某'],'年龄':[22,26,24]})
>>> right = pd.DataFrame({'姓名':['张某','李某','段某'],'年龄':[22,np.nan,np.nan],'籍贯':['北京','河北','江苏']}) #根据left中的值去填补right中的值
>>> right.combine_first(left)
姓名 年龄 籍贯
0 张某 22.0 北京
1 李某 26.0 河北
2 段某 24.0 江苏
10-Pandas之数据融合(pd.merge()、df.join()、df.combine_first()详解)的更多相关文章
- 如何用R来处理数据表的长宽转换(图文详解)
不多说,直接上干货! 很多地方都需用到这个知识点,比如Tableau里. 通常可以采取如python 和 r来作为数据处理的前期. Tableau学习系列之Tableau如何通过数据透视表方式读取 ...
- legend3---Windows 7/8/10 系统下Laravel框架的开发环境安装及部署详解(Vagrant + Homestead)
legend3---Windows 7/8/10 系统下Laravel框架的开发环境安装及部署详解(Vagrant + Homestead) 一.总结 一句话总结: 1.安装的话就是下载好git,va ...
- df 和 du 命令详解
df命令详细用法 a:显示全部的档案系统和各分割区的磁盘使用情形 i:显示i -nodes的使用量 k:大小用k来表示 (默认值) t:显示某一个档案系统的所有分割区磁盘使用量 x:显示不是某一个档案 ...
- 如何用Python来处理数据表的长宽转换(图文详解)
不多说,直接上干货! 很多地方都需用到这个知识点,比如Tableau里. 通常可以采取如python 和 r来作为数据处理的前期. Tableau学习系列之Tableau如何通过数据透视表方式读取 ...
- 大数据学习笔记——Spark工作机制以及API详解
Spark工作机制以及API详解 本篇文章将会承接上篇关于如何部署Spark分布式集群的博客,会先对RDD编程中常见的API进行一个整理,接着再结合源代码以及注释详细地解读spark的作业提交流程,调 ...
- linux超级块和inode 详解 和 df 、du 命令详解与环境变量
一.inode块,Unix文件的核心. 首先需要明白的是,在Unix操作系统中的任何资源都被当作文件来管理.如目录.光驱.终端设备等等,都被当作是一种文件.从这方面来说,Unix操作系统中的所有的目录 ...
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- Windows 7/8/10 系统下Laravel框架的开发环境安装及部署详解(Vagrant + Homestead)
注意! laravel/homestead box项目地址已经不再是原来的 https://atlas.hashicorp.com/laravel/boxes/homestead 而已经变更成 htt ...
- 2018.10.7 理解Hibernate的工作原理及其中的ORM详解
复习 hibernate框架 简介j及其搭建: hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库. 1 ...
随机推荐
- html通过css,js实现div悬浮效果总汇,如原生JS实现滚动到一定位置实现div悬浮
在我们的实际开发中,经常会遇到页面中需要悬浮效果,比如最早的客服联系,对联悬浮广告等,今天为大家介绍一些如何实现div悬浮的效果. 传统的fixed实现: 通过css中的属性position参数设为f ...
- 「疫期集训day11」沙漠
可恶的英格兰人,为了石油而攻打我们----岂能让他们得逞?----鄂斯曼帝国的士兵 今天整理日,不错不错 写了一天的DP,截一些较好的题: 收获: \(1.\) 对拍更熟练了,主要是线段和合并饭团两题 ...
- smtp 发送邮件实例
发送邮件的关键点在于邮箱服务器地址是否一致 //smtp 服务器地址,咨询 smtp 提供商,例如 smtp.126.net 这种格式,端口和服务器地址是配套的,一般是 465 或者 25 SmtpC ...
- 核心知识点:python入门
目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...
- SQL列转行,行转列实现
在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...
- python 将指定文件夹中的指定文件放入指定文件夹中
import os import shutil import re #获取指定文件中文件名 def get_filename(filetype): name =[] final_name_list = ...
- 纯 CSS 实现滑动轮播图效果
只使用css实现轮播图简单的操作 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- Burp Suite Sequencer Modules - 定序器模块
Sequencer 主要用于处理和分析Tokens 目标网站:http://testaspnet.vulnweb.com/ (1)通过代理,拦截数据流. (2)Send to Sequencer,然后 ...
- Active Directory - Right Delegation and Audit
Delegate proper right to some user: Login/Logout Audit - GPO Setting - Event Viewer File Auditing M ...
- 集训作业 洛谷P3913 车的攻击
这个题一开始被我想复杂了,但总体差不多. 脑子清醒后我直接看他占领了几条长,几条宽,比如一个长3宽3的地图. 被占领了一条宽,就可以看成一个长3宽2的地图.这个长3宽2的地图就是出去可以被攻击的点剩下 ...