这一节我们将看一下如何通过 join 和 merge 来合并 dataframe.

import pandas as pd

df1 = pd.DataFrame({'HPI':[80,85,88,85],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55]},
index = [2001, 2002, 2003, 2004]) df2 = pd.DataFrame({'HPI':[80,85,88,85],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55]},
index = [2005, 2006, 2007, 2008]) df3 = pd.DataFrame({'HPI':[80,85,88,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53]},
index = [2001, 2002, 2003, 2004])

还是用上一节的例子, 但是我在 df3 的列上做了一点改动, 先来看下 merge 的用法:

print(pd.merge(df1,df3, on='HPI'))

输出:

    HPI  Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
0 80 2 50 7 50
1 85 3 55 8 52
2 85 3 55 6 53
3 85 2 55 8 52
4 85 2 55 6 53
5 88 2 65 9 50

这个例子中, 是以列 "HPI" 为基准做的合并, merge 的时候, 会自动忽略索引列. 当然, 我们也可以使用多个列做基准如下:

print(pd.merge(df1,df2, on=['HPI','Int_rate']))

输出:

   HPI  Int_rate  US_GDP_Thousands_x  US_GDP_Thousands_y
0 80 2 50 50
1 85 3 55 55
2 88 2 65 65
3 85 2 55 55

大家可能也注意到了这里有两个版本的 "US_GDP_Thousands", 并用 "x" 和 "y" 加以区分. 这是因为我们没有共享这个列, 所以两个列都要保留. 这也是为什么我之前说 Pandas 可以与 mysql 很好地合作.

通常情况下, 我们应该尽可能保持数据库的轻量化, 这样执行查询的速度才能更快.

加入你要建一个网站, 你需要保存用户的相关信息, 比如用户名, 密码, 邮箱, 注册时间等基本信息. 另外, 你可能还需要保存用户设置, 用户发的帖子等其他的信息. 随着网站功能的完善, 可能需要保存的信息也会越来越多, 你当然可以建一个很大的信息涵盖所有信息的表, 但是那会导致你查询任意某个信息都会很慢, 所以更好的做法是分成几个小表, 分块保存信息. 然后你还可以像下面这样通过 merge 把两个表连起来, 然后再重新定义索引:

df4 = pd.merge(df1,df3, on='HPI')
df4.set_index('HPI', inplace=True)
print(df4)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
HPI
80 2 50 7 50
85 3 55 8 52
85 3 55 6 53
85 2 55 8 52
85 2 55 6 53
88 2 65 9 50

那么, 如果在合并之前, HPI 就是索引, 在这种情况下, 我们就可以用 join:

df1.set_index('HPI', inplace=True)
df3.set_index('HPI', inplace=True) joined = df1.join(df3)
print(joined)

输出:

     Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
HPI
80 2 50 7 50
85 3 55 8 52
85 3 55 6 53
85 2 55 8 52
85 2 55 6 53
88 2 65 9 50

从上面两个例子可以看出, join 和 merge 就是在设置索引上有些许不同. 我们现在改下初始数据结构, 进一步分析:

df1 = pd.DataFrame({
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
'Year':[2001, 2002, 2003, 2004]
}) df3 = pd.DataFrame({
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
'Year':[2001, 2003, 2004, 2005]})

这里我们把两个 dataframe 都设置了 "Year" 列, 只是具体的年份有些不同, 那么这二者合并会怎样呢?

merged = pd.merge(df1,df3, on='Year')
print(merged)

输出:

   Year  Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
0 2001 2 50 7 50
1 2003 2 65 8 52
2 2004 2 55 9 50

调整一下索引, 是它看起来更清楚:

merged = pd.merge(df1,df3, on='Year')
merged.set_index('Year', inplace=True)
print(merged)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2 50 7 50
2003 2 65 8 52
2004 2 55 9 50

相信大家已经看到了, 2005和2002两行数据都没有了. merge 默认取两个数据的并集来做合并. 这就引出了另一个参数 "how", 通过对这个参数的定义, 可以选择以什么样的方式合并数据. 参数值有以下四种:

Left - 以左边的索引值为准.
Right - 以右边的索引值为准.
Outer - 取并集.
Inner - 取交集.

merged = pd.merge(df1,df3, on='Year', how='left')
merged.set_index('Year', inplace=True)
print(merged)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2 50 7.0 50.0
2002 3 55 NaN NaN
2003 2 65 8.0 52.0
2004 2 55 9.0 50.0

以上就是左对齐的输出效果, 下面看下右对齐:

merged = pd.merge(df1,df3, on='Year', how='right')
merged.set_index('Year', inplace=True)
print(merged)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2.0 50.0 7 50
2003 2.0 65.0 8 52
2004 2.0 55.0 9 50
2005 NaN NaN 6 53

再来看下 outer 的效果:

merged = pd.merge(df1,df3, on='Year', how='outer')
merged.set_index('Year', inplace=True)
print(merged)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2.0 50.0 7.0 50.0
2002 3.0 55.0 NaN NaN
2003 2.0 65.0 8.0 52.0
2004 2.0 55.0 9.0 50.0
2005 NaN NaN 6.0 53.0

再来看下 inner 的合并效果:

merged = pd.merge(df1,df3, on='Year', how='inner')
merged.set_index('Year', inplace=True)
print(merged)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2 50 7 50
2003 2 65 8 52
2004 2 55 9 50

以 inner 的方式合并, 也是 merge 默认的合并方式.

现在我们来看下 join 的合并效果, 基本上跟 merge 是一样的:

df1.set_index('Year', inplace=True)
df3.set_index('Year', inplace=True)
joined = df1.join(df3, how="outer")
print(joined)

输出:

      Int_rate  US_GDP_Thousands  Unemployment  Low_tier_HPI
Year
2001 2.0 50.0 7.0 50.0
2002 3.0 55.0 NaN NaN
2003 2.0 65.0 8.0 52.0
2004 2.0 55.0 9.0 50.0
2005 NaN NaN 6.0 53.0

目前为止, 我们已经对合并数据有了基本的了解, 下一节, 我们将继续在不动产投资的例子中应用这些知识.

总结一下, 当你不需要原索引的时候, 就可以用 merge 来合并, 当你需要用原索引的时候, 就可以用 join. 而 concatenation 和 append 主要用于你要增加数据行数的时候.

后面会持续更新, 有任何问题或者错误, 欢迎留言, 希望和大家交流学习.

基于 Python 和 Pandas 的数据分析(6) --- Joining and Merging的更多相关文章

  1. 基于 Python 和 Pandas 的数据分析(1)

    基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...

  2. 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集

    这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...

  3. 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础

    在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...

  4. 基于 Python 和 Pandas 的数据分析(7) --- Pickling

    上一节我们介绍了几种合并数据的方法. 这一节, 我们将重新开始不动产的例子. 在第四节中我们写了如下代码: import Quandl import pandas as pd fiddy_states ...

  5. 基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础

    这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在 ...

  6. 基于 Python 和 Pandas 的数据分析(5) --- Concatenating and Appending

    这一节我们将会介绍几种不同的合并数据的方法. 在我们这个不动产投资的例子中, 我们希望获取 51 个州的房产数据, 并把它们组合起来. 我们这样做有很多原因. 这样做既便于我们做分析, 同时也可以占用 ...

  7. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  8. 万字长文,Python数据分析实战,使用Pandas进行数据分析

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  9. 基于python 信用卡评分系统 的数据分析

    基于python 信用卡评分系统 的数据分析 import pandas as pd import matplotlib.pyplot as plt #导入图像库 from sklearn.ensem ...

随机推荐

  1. tft屏图像显示也成功完成

    2010-04-30 14:18:00 tft屏图像显示也成功完成. 其实有了刷屏的经验,图像显示就很简单. void address_set(uint x1,uint y1,uint x2,uint ...

  2. django 集合

    1,前言 socket 位于应用层和传输层之间的一个抽象层,它是一个接口. 百度的服务器(socket服务端) . 启动socket . 绑定ip和端口 . 监听 . 接收数据 . 发送数据 . 断开 ...

  3. Linux 安装 mysql 数据库

    1. 克隆虚拟机 2. 上传安装文件 1.上传文件 2.解压文件 tar -xvf 文件 3. 安装数据库 安装顺序: .debuginfo .shared .client .server 1. rp ...

  4. Oracle通过dblink连接MySQL

    需要把MySQL的一些数据同步到Oracle,用ETL工具太麻烦了,通过参考官方文档实现了oracle to mysql dblink.每次修改配置后,需要重启监听才能生效,或者 reload一下,确 ...

  5. linux 安装 ImageMagick 和 imagick 扩展

    使用命令安装 1.依次运行以下命令 yum install ImageMagick yum install ImageMagick-devel yum install php-pear 安装php-p ...

  6. 值得收藏的8个Web端组件库

    值得收藏的8个Web端组件库 Ant Design 介绍:一个服务于企业级产品的设计体系,基于『确定』和『自然』的设计价值观和模块化的解决方案,让设计者专注于更好的用户体验. 组件库地址:https: ...

  7. Java字节码浅析(—)

    英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么.理解这点不仅能搞清语言特 ...

  8. Java排序算法之选择排序

    一.算法原理 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arrr[0]交换:第2趟,在待排序 ...

  9. Python3基础 frozenset 使用list创建frozenset

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢?

    shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢? 这确实是一个困扰很久的一个问题? how it can be an issue? 事实上, 在shell中, 你可以认为 ...