这一节我们将看一下如何通过 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. 目标检测论文阅读:Deformable Convolutional Networks

    https://blog.csdn.net/qq_21949357/article/details/80538255 这篇论文其实读起来还是比较难懂的,主要是细节部分很需要推敲,尤其是deformab ...

  2. 使用Oracle数据库时的org.springframework.jdbc.BadSqlGrammarException:

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...

  3. django自定义错误响应

    在做一个web时,总是会出现各种错误,如400.403.404.500等.一般开发都要做对应的处理,给一些友好提示,或返回一些公益广告等. 在Django中,默认提供了常见的错误处理方式,比如: ha ...

  4. Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战

    基础知识 class scrapy.spiders.CrawlSpider 这是抓取一般网页最常用的类,除了从Spider继承过来的属性外,其提供了一个新的属性rules,它提供了一种简单的机制,能够 ...

  5. MySQL5.7 的新特点

    1.安全性 MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有一些重要的改变. mysql.user表结构升级 MySQL5.7用户表my ...

  6. udp丢包 处理

    转自: 自己在做UDP传输时遇到的问题,接收端没设置缓存,结果总是丢包. 看到这篇文章设置了一下接收缓存就好 *;//设置为32K setsockopt(s,SOL_SOCKET,SO_RCVBUF, ...

  7. Nginx:论高并发,在座各位都是渣渣

    NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...

  8. gitlab服务器迁移

    公司更换了新的服务器,需要把原先的gitlab迁移到新的服务器上. 1.迁移准备工作和思路:从a服务器迁移到b服务器,由于Gitlab自身的兼容性问题,高版本的Gitlab无法恢复低版本备份的数据,需 ...

  9. 2018-2019-1 20189206 vim.c插件安装

    vim插件安装 vim插件安装 由于今天在安装vim.c插件耗费了很多时间,配置文件一直不生效,特此记录以下安装插件的方法. 安装vim.c按照博客的方法 第一步:创建目录~/.vim 这个目录是用来 ...

  10. webpack --watch和supervisor的不同

     webpack --watch只是热打包,也就是前端代码的热加载,要实现后端代码的热加载,也就是热部署,需要使用supervisor 如何使用热部署可以参考这里:http://www.cnblogs ...