本节讲述对于两个数据集按照相同列的值进行合并。

首先定义原始数据:

  1. import pandas as pd
  2. import numpy as np
  3. data0 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
  4. 'A': ['A0', 'A1', 'A2', 'A3'],
  5. 'B': ['B0', 'B1', 'B2', 'B3']
  6. })
  7. data1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
  8. 'C': ['C0', 'C1', 'C2', 'C3'],
  9. 'D': ['D0', 'D1', 'D2', 'D3']
  10. })
  11. print("data0:")
  12. print(data0)
  13. print("data1:")
  14. print(data1)

输出为:

  1. data0:
  2. A B key
  3. 0 A0 B0 K0
  4. 1 A1 B1 K1
  5. 2 A2 B2 K2
  6. 3 A3 B3 K3
  7. data1:
  8. C D key
  9. 0 C0 D0 K0
  10. 1 C1 D1 K1
  11. 2 C2 D2 K2
  12. 3 C3 D3 K3

啥也不做,直接合并:

  1. print(pd.merge(data0, data1))

输出为:

  1. A B key C D
  2. 0 A0 B0 K0 C0 D0
  3. 1 A1 B1 K1 C1 D1
  4. 2 A2 B2 K2 C2 D2
  5. 3 A3 B3 K3 C3 D3

默认情况下的合并是根据两个数据集中共同的列拥有相同的值来进行合并的。

我们再举一个例子,大家可以观察下:

  1. import pandas as pd
  2. import numpy as np
  3. data0 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
  4. 'key2': ['K0', 'K1', 'K0', 'K1'],
  5. 'A': ['A0', 'A1', 'A2', 'A3'],
  6. 'B': ['B0', 'B1', 'B2', 'B3']
  7. })
  8. data1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
  9. 'key2': ['K0', 'K0', 'K0', 'K0'],
  10. 'C': ['C0', 'C1', 'C2', 'C3'],
  11. 'D': ['D0', 'D1', 'D2', 'D3']
  12. })
  13. print("data0:")
  14. print(data0)
  15. print("data1:")
  16. print(data1)
  17. print("合并后的数据为:")
  18. print(pd.merge(data0, data1))

输出为:

  1. data0:
  2. A B key1 key2
  3. 0 A0 B0 K0 K0
  4. 1 A1 B1 K0 K1
  5. 2 A2 B2 K1 K0
  6. 3 A3 B3 K2 K1
  7. data1:
  8. C D key1 key2
  9. 0 C0 D0 K0 K0
  10. 1 C1 D1 K1 K0
  11. 2 C2 D2 K1 K0
  12. 3 C3 D3 K2 K0
  13. 合并后的数据为:
  14. A B key1 key2 C D
  15. 0 A0 B0 K0 K0 C0 D0
  16. 1 A2 B2 K1 K0 C1 D1
  17. 2 A2 B2 K1 K0 C2 D2

在merge参数中可以添加how的参数,这个参数默认为inner,可选值有:

left,right,outer,inner。

对于how='outer'

不管key有没有一模一样,都把它们给复制下来,例如:

  1. print(pd.merge(data0, data1, how='outer'))

输出为:

  1. A B key1 key2 C D
  2. 0 A0 B0 K0 K0 C0 D0
  3. 1 A1 B1 K0 K1 NaN NaN
  4. 2 A2 B2 K1 K0 C1 D1
  5. 3 A2 B2 K1 K0 C2 D2
  6. 4 A3 B3 K2 K1 NaN NaN
  7. 5 NaN NaN K2 K0 C3 D3

如果我们设置how='right',则输出结果会以第二个数据集的key为准:

  1. print(pd.merge(data0, data1, how='right'))

输出为:

  1. A B key1 key2 C D
  2. 0 A0 B0 K0 K0 C0 D0
  3. 1 A2 B2 K1 K0 C1 D1
  4. 2 A2 B2 K1 K0 C2 D2
  5. 3 NaN NaN K2 K0 C3 D3

indicator

indicator参数用来指示出当前记录的合并方式,例如:

  1. print(pd.merge(data0, data1, indicator=True, how='outer'))

输出:

  1. A B key1 key2 C D _merge
  2. 0 A0 B0 K0 K0 C0 D0 both
  3. 1 A1 B1 K0 K1 NaN NaN left_only
  4. 2 A2 B2 K1 K0 C1 D1 both
  5. 3 A2 B2 K1 K0 C2 D2 both
  6. 4 A3 B3 K2 K1 NaN NaN left_only
  7. 5 NaN NaN K2 K0 C3 D3 right_only

目前,indicator默认的列名为 _merge,如果你看着不爽,可以通过indicator="字段名"的方式来修改这个字段名。

按照index进行合并

前面是通过字段名来进行合并的,但有时我们可以把index看成是一个主键,这样就相当于根据主键进行合并数据,例如:

  1. import pandas as pd
  2. import numpy as np
  3. data0 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
  4. 'key2': ['K0', 'K1', 'K0', 'K1'],
  5. 'A': ['A0', 'A1', 'A2', 'A3'],
  6. 'B': ['B0', 'B1', 'B2', 'B3']
  7. }, index=["T0", "T1", "T2", "T3"])
  8. data1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
  9. 'key2': ['K0', 'K0', 'K0', 'K0'],
  10. 'C': ['C0', 'C1', 'C2', 'C3'],
  11. 'D': ['D0', 'D1', 'D2', 'D3']
  12. },
  13. index=["T0", "T1", "T4", "T5"])
  14. print("data0:")
  15. print(data0)
  16. print("data1:")
  17. print(data1)
  18. print("合并后的数据为:")
  19. print(pd.merge(data0, data1, left_index=True, right_index=True))

输出为:

  1. data0:
  2. A B key1 key2
  3. T0 A0 B0 K0 K0
  4. T1 A1 B1 K0 K1
  5. T2 A2 B2 K1 K0
  6. T3 A3 B3 K2 K1
  7. data1:
  8. C D key1 key2
  9. T0 C0 D0 K0 K0
  10. T1 C1 D1 K1 K0
  11. T4 C2 D2 K1 K0
  12. T5 C3 D3 K2 K0
  13. 合并后的数据为:
  14. A B key1_x key2_x C D key1_y key2_y
  15. T0 A0 B0 K0 K0 C0 D0 K0 K0
  16. T1 A1 B1 K0 K1 C1 D1 K1 K0

这里需要同时设置left_index=True, right_index=True

相同列名添加后缀区分

如果我们不加任何后缀的情况下,系统会自动添加_x,_y之类的后缀进行区分,例如:

  1. import pandas as pd
  2. import numpy as np
  3. data0 = pd.DataFrame({'k': ['K0', 'K1', 'K2'],
  4. 'age': [1, 2, 3]})
  5. data1 = pd.DataFrame({'k': ['K0', 'K0', 'K3'],
  6. 'age': [4, 5, 6]})
  7. print("data0:")
  8. print(data0)
  9. print("data1:")
  10. print(data1)
  11. print("合并后的数据为:")
  12. print(pd.merge(data0, data1, on='k'))

输出为:

  1. data0:
  2. age k
  3. 0 1 K0
  4. 1 2 K1
  5. 2 3 K2
  6. data1:
  7. age k
  8. 0 4 K0
  9. 1 5 K0
  10. 2 6 K3
  11. 合并后的数据为:
  12. age_x k age_y
  13. 0 1 K0 4
  14. 1 1 K0 5

我们可以通过suffixes属性来修改默认的后缀名:

  1. print(pd.merge(data0, data1, on='k', suffixes=['_boy', '_girl']))

输出为:

  1. age_boy k age_girl
  2. 0 1 K0 4
  3. 1 1 K0 5

pandas合并merge-【老鱼学pandas】的更多相关文章

  1. pandas画图-【老鱼学pandas】

    本节主要讲述如何把pandas中的数据用图表的方式显示在屏幕上,有点类似在excel中显示图表. 安装matplotlib 为了能够显示图表,首先需要安装matplotlib库,安装方法如下: pip ...

  2. pandas合并数据集-【老鱼学pandas】

    有两个数据集,我们想把他们的结果根据相同的列名或索引号之类的进行合并,有点类似SQL中的从两个表中选择出不同的记录并进行合并返回. 合并 首先准备数据: import pandas as pd imp ...

  3. pandas基本介绍-【老鱼学pandas】

    前面我们学习了numpy,现在我们来学习一下pandas. Python Data Analysis Library 或 pandas 主要用于处理类似excel一样的数据格式,其中有表头.数据序列号 ...

  4. pandas选择数据-【老鱼学pandas】

    选择列 根据列名来选择某列的数据 import pandas as pd import numpy as np dates = pd.date_range("2017-01-08" ...

  5. pandas设置值-【老鱼学pandas】

    本节主要讲述如何根据上篇博客中选择出相应的数据之后,对其中的数据进行修改. 对某个值进行修改 例如,我们想对数据集中第2行第2列的数据进行修改: import pandas as pd import ...

  6. pandas处理丢失数据-【老鱼学pandas】

    假设我们的数据集中有缺失值,该如何进行处理呢? 丢弃缺失值的行或列 首先我们定义了数据集的缺失值: import pandas as pd import numpy as np dates = pd. ...

  7. pandas导入导出数据-【老鱼学pandas】

    pandas可以读写如下格式的数据类型: 具体详见:http://pandas.pydata.org/pandas-docs/version/0.20/io.html 读取csv文件 我们准备了一个c ...

  8. numpy的array合并-【老鱼学numpy】

    概述 本节主要讲述如何把两个数组按照行或列进行合并. 按行进行上下合并 例如: import numpy as np a = np.array([1, 1, 1]) b = np.array([2, ...

  9. tensorflow卷积神经网络-【老鱼学tensorflow】

    前面我们曾有篇文章中提到过关于用tensorflow训练手写2828像素点的数字的识别,在那篇文章中我们把手写数字图像直接碾压成了一个784列的数据进行识别,但实际上,这个图像是2828长宽结构的,我 ...

随机推荐

  1. 六、Java多人博客系统-2.0版本-代码实现

    1.前后端分离,后端使用spring boot,只负责提供数据,对外暴露Restful API.前端使用vue,只负责展示数据和向后台提交数据. 2.数据库使用mariadb,存储所有数据. 3.前端 ...

  2. 打开mac上面的apache 服务器

    1. apache 服务器在系统安装的时候就默认安装了 config 文件未知:  /etc/apache2/httpd.conf 2. 编辑配置文件 httpd.conf 2.1 查找  Docum ...

  3. P2822 组合数问题 HMR大佬讲解

    今天HMR大佬给我们讲解了这一道难题. 基本思路是: 可以将问题转化为:求出杨辉三角,用二维数组f[i][j]来表示在杨辉三角中以第i行第j列的点为右下角,第0行第0列处的点为左上角的矩阵中所有元素是 ...

  4. P1020 导弹拦截 (贪心+最长不降子序列)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  5. 项目管理——WBS工作分解法

    首先我们要了解什么是WBS工作分解法 工作分解结构(Work Breakdown Structure,简称WBS)跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一 ...

  6. JS学习笔记Day15

    一.ES5及ES6 (一)严格模式 (二)bind/call/apply(改变上下文this指向,都是函数对象的方法) 1.bind:返回值是一个函数 2.call:返回值是一个对象 3.apply: ...

  7. LCA(ST倍增)

    时间复杂度: dfs树,求st表(状态数组f):O(NlgN) 处理M个查询:O(MlgN) 总:O((M+N)lgN) #include<iostream> #include<cs ...

  8. vue-resource的使用,前后端数据交互

    vue-resource的使用,前后端数据交互 1:导入vue与vue-resource的js js下载:   https://pan.baidu.com/s/1fs5QaNwcl2AMEyp_kUg ...

  9. [物理学与PDEs]第5章习题10 多凸函数一个例子

    证明函数 $$\bex \hat W({\bf F})=\sedd{\ba{ll} \cfrac{1}{\det{\bf F}},&if\ \det{\bf F}>0,\\ +\inft ...

  10. Linux配置日志服务器

    title: Linux配置日志服务器 tags: linux, 日志服务器 --- Linux配置日志服务器 日志服务器配置文件:/etc/rsyslog.conf 服务器端: 服务器IP如下: 编 ...