基于 Python 和 Pandas 的数据分析(6) --- Joining and Merging
这一节我们将看一下如何通过 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的更多相关文章
- 基于 Python 和 Pandas 的数据分析(1)
基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...
- 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集
这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...
- 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础
在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...
- 基于 Python 和 Pandas 的数据分析(7) --- Pickling
上一节我们介绍了几种合并数据的方法. 这一节, 我们将重新开始不动产的例子. 在第四节中我们写了如下代码: import Quandl import pandas as pd fiddy_states ...
- 基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础
这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在 ...
- 基于 Python 和 Pandas 的数据分析(5) --- Concatenating and Appending
这一节我们将会介绍几种不同的合并数据的方法. 在我们这个不动产投资的例子中, 我们希望获取 51 个州的房产数据, 并把它们组合起来. 我们这样做有很多原因. 这样做既便于我们做分析, 同时也可以占用 ...
- python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)
python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...
- 万字长文,Python数据分析实战,使用Pandas进行数据分析
文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...
- 基于python 信用卡评分系统 的数据分析
基于python 信用卡评分系统 的数据分析 import pandas as pd import matplotlib.pyplot as plt #导入图像库 from sklearn.ensem ...
随机推荐
- Java中在java.sql.Date的系统时间上加上30天并写入oracle
在java.sql.Date的系统时间上加上30天,并写入oracle 思路:通过 Calendar.getInstance() 获得对象,然后 add() 方法添加 时间,再通过 new java. ...
- C++ 开源库列表
https://zh.cppreference.com/w/cpp/links/libs
- 怎样从外网访问内网MySQL数据库?
本地安装了一个MySQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MySQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MySQL数据库 默认安装的MySQL ...
- Mysql初级第三天(wangyun)
1.JDBC简介 1).数据库驱动 2).SUN公司为统一数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 3).JDBC全称:Java Database Connectivity( ...
- ltp makefile 解析
困惑于 /include/mk/automake.mk中出现了第一个目标 而makefile却任然将all当做最终目标 测试了一番后发觉: ifeq ($(MAKE_3_80_COMPAT),1)# ...
- Django 事物
事物 在这里指,将一些关于数据库的一系列操作,打包成一个原子性操作,意思是这一系列操作必须全部执行成功,如果,其中某个操作没有成功,那么这一系列操作都将滚回到之前没执行的状态,包括其中执行成功的某些操 ...
- jQuery实现广告弹窗
首先设置一个固定的窗口位于右下角,效果如下: 代码: jQuery实现广告弹窗.html 之后将该窗口初始设为隐藏,通过代码实现3秒自动显示,5秒自动隐藏,其效果如下: <!DOCTYPE ht ...
- epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
转自:http://www.cnblogs.com/yuuyuu/p/5103744.html 一.基本概念 ...
- 【题解】luogu P3386 【模板】二分图匹配
题面:https://www.luogu.org/problemnew/show/P3386 好像没有人发Ford-Fulkerson,我来一发, 这道题和P2756飞行员配对方案问题方法一样,网络流 ...
- pycharm 安装激活操作
pycharm 安装激活操作 什么是 PyCharm PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管 ...