这一节我们将看一下如何通过 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. Matlab基础部分1

  2. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

  3. brctl 命令详解

    安装网桥管理工具包:bridge-utile ```# yum install bridge-utils -y``` ```使用brctl命令创建网桥br1```# brctl addbr br1`` ...

  4. onclick或者其他事件在部分移动端无效的问题

    最近开发碰到一个问题,大多数手机都可以正常访问点击,但是有部分手机onclick无效,不知道可能是什么原因?该如何解决? 我遇到的这个问题,实际不是onclick的原因,而是因为js里面包含es6的语 ...

  5. 数据分析之pandas01

    Series 一.Series Series是一种类似于一维数组的对象,有两部分组成:     .values:一组数据(ndarray类型)     .index: 相关的数据索引标签 二.seri ...

  6. iOS项目之解析HTML数据

    最近因为需求,一直在做HTML数据的解析,从网页中去获取需要的数据,然后展示到自己的app中. 在网上找了很多资料,大多都是TFHpple这个第三方框架,能够根据标签节点获取对应的数据,但是现在我需要 ...

  7. No module named scrapy 成功安装scrapy,却无法import的解决方法

    今天本来准备写一个Python的爬虫,然而使用pip安装了Scrapy之后,却无论如何也无法import,显示的结果总是ImportError: No module named Scrapy.网上查阅 ...

  8. PHP优化加速之Opcache使用总结

    PHP优化加速之Opcache使用总结: Opcache是一种通过将解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从 ...

  9. python之块包导入

    一.模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...

  10. topcoder srm 699 div1 -3

    1.两个长度为$n$的数组$a,b$,$0 \leq a_{i} <2^{30}$.$b_{i}=-1$或者$b_{i}$为除$a_{i}$外其他数字的抑或值.现在给定$b$,如果不存在$a$, ...