如何在Python中使用Pandas merge进行数据合并

108 阅读8分钟

如何在Python中使用Pandas merge来合并数据

使用流行的Pandas库进行数据操作和分析,从两个文件中读取数据,并将它们连接成一个数据集。

Martin Heller作者: Martin Heller

InfoWorld特约编辑

思维导图

2019年12月,我的InfoWorld同事Sharon Machlis写了一篇名为 "如何使用R merge、dplyr或data.table在R中合并数据"的文章。Sharon在R编程以及一般的分析方面是个奇才,这在文章中体现得淋漓尽致。但如果你打算使用Python和(例如)Scikit-learnPyTorchTensorFlow对数据进行机器学习或深度学习呢?虽然有可能将数据从R语言传递到Python,但这并不是解决问题的最佳方案。

在这篇文章中,我将讨论如何在Python中完成数据合并,这将使内存中合并的数据集很容易传递给Python人工智能框架之一。我将使用与Sharon相同的公共数据集,这些数据集记录了美国航空公司的航班延误,但我将坚持使用最适合的框架,目前是Pandas

[收听Serdar Yegulalp的智能Python视频教程,在5分钟或更短时间内学习智能Python技巧。]

Pandas和DataFrame

Pandas是一个BSD授权的开源库,为Python提供高性能、易于使用的数据结构和数据分析工具。R数据框架的数据结构在Pandas中有一个接近的对应物,即DataFrame。正如Pandas项目对它的描述。

DataFrame是一个二维标签的数据结构,具有潜在的不同类型的列。你可以把它想象成电子表格或SQL表,或者是Series对象的一个区块。它通常是最常用的Pandas对象。

潘达斯合并

连接两个DataFrame对象的Pandas方法是merge() ,它是DataFrame或命名的系列对象之间所有标准数据库连接操作的单一入口。(系列对象是一维的。)merge 方法的规范是。

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
  • left: 一个DataFrame或命名的系列对象。

  • right: 另一个DataFrame或命名的系列对象。

  • on :要连接的列或索引级名称。必须在左边和右边的DataFrame和/或Series对象中都能找到。如果没有传递,并且 和 是 ,那么数据框架和/或系列中的列的交集将被推断为连接键。left_index right_index False

  • left_on: 左边的数据框架或系列中的列或索引级别作为键使用。可以是列名、索引级名,或者是长度等于DataFrame或系列长度的数组。

  • right_on: 右侧DataFrame或系列中的列或索引级别作为键使用。可以是列名、索引级名或长度等于DataFrame或系列长度的数组。

  • left_index: 如果 ,使用左边DataFrame或系列的索引(行标签)作为其连接键。如果是带有多索引(分层)的DataFrame或系列,层数必须与右边DataFrame或系列的连接键的数量一致。True

  • right_index: 对于右边的数据框架或系列,与 相同的用法。left_index

  • how: , , ' , 或 中的一个。默认为内部。每个方法的详细描述见下文。left right``outer inner

  • sort 排序:按连接键对结果DataFrame进行排序,按词汇表顺序排序。默认为 ;在许多情况下,设置为 ,将大大改善性能。True False

  • suffixes: 一个字符串后缀的元组,应用于重叠的列。默认为 。('_x', '_y')

  • copy: 始终从传递的DataFrame或命名的Series对象中复制数据(默认为 ),即使没有必要重新索引。在很多情况下无法避免,但是可以提高性能和内存使用。可以避免复制的情况是有些病态的,但还是提供了这个选项。True

  • indicator _merge _merge 是分类型的,对于合并键只出现在 DataFrame或系列中的观测值,取值为 ;对于合并键只出现在 DataFrame或系列中的观测值,取值为 ;如果观测的合并键在两者中都能找到,则取值为 。left left_only right right_only

  • validate :字符串,默认为 。如果指定,则检查合并是否为指定类型。None

  • one_to_one 或 : 检查合并键是否在左右数据集中都是唯一的。1:1

  • one_to_many 或 : 检查合并键是否在左数据集中是唯一的。1:m

  • many_to_one 或 : 检查合并键是否在右数据集中是唯一的。m:1

  • many_to_many 或 : 允许,但不会产生检查。m:m

在Pandas中读取一个CSV文件

正如你所期望的,Pandas有一个读取CSV文件的方法,pd.read_csv() ,它返回一个DataFrame。它有许多可选参数,但对于我们的目的,只有基本参数是必需的。

filepath_or_buffer :各种

文件的路径(str,pathlib.Path,或者py._path.local.LocalPath),URL(包括HTTP,FTP和Amazon S3的位置),或者任何有read() 方法的对象(比如open file或者StringIO)。

Sep : str,默认为',' ,用于read_csv()\t 用于read_table()

要使用的分隔符。如果sep是None ,C引擎不能自动检测分隔符,但Python解析引擎可以,这意味着将使用后者并由Python内置的嗅探工具csv.Sniffer自动检测分隔符。此外,长于一个字符且不同于'\s+' 的分隔符将被解释为正则表达式,也会强制使用Python解析引擎。请注意,正则表达式的分隔符容易忽略带引号的数据。正则表达式例子:'\\r\\t'

delim_whitespace: 布尔型,默认False

指定是否使用空格(例如:' ''\t')作为定界符。相当于设置sep='\s+' 。如果该选项被设置为True ,则不应该传入任何分隔符参数。

美国航班延误数据集

Sharon使用了美国交通统计局航班延误数据集中的两个表格,即实际的航班延误数据和报告航空公司的查询表。为了与Sharon的分析相比较,让我们下载她的文件,在这里找到。

你将得到的压缩文件还包括Sharon的R代码和一个PowerPoint演示文稿。继续解压rmerges3ways.zip文件。然后解压文件673598238_T_ONTIME_REPORTING.zip,得到673598238_T_ONTIME_REPORTING.csv。我们将与L_UNIQUE_CARRIERS.csv_一起使用该CSV文件。注意后者文件名中的尾部下划线。该文件实际上是一个有效的逗号分隔的变量格式;USBoTS网站在生成查询表时加入了下划线。

在文本编辑器中查看这两个CSV文件的前20行(如下),我们看到这两个文件都有标题行,并且确实使用逗号作为分隔符。这意味着read_csv() 的默认值是可以的;我们只需要指定文件路径。

延迟数据。

"FL_DATE","OP_UNIQUE_CARRIER","ORIGIN","DEST","DEP_DELAY_NEW",
2019-08-01,"DL","ATL","DFW",31.00,
2019-08-01,"DL","DFW","ATL",0.00,
2019-08-01,"DL","IAH","ATL",40.00,
2019-08-01,"DL","PDX","SLC",0.00,
2019-08-01,"DL","SLC","PDX",0.00,
2019-08-01,"DL","DTW","ATL",10.00,
2019-08-01,"DL","ATL","DTW",0.00,
2019-08-01,"DL","MSP","JFK",22.00,
2019-08-01,"DL","JFK","MSP",0.00,
2019-08-01,"DL","BHM","ATL",0.00,
2019-08-01,"DL","ATL","BHM",0.00,
2019-08-01,"DL","ATL","BOS",17.00,
2019-08-01,"DL","BOS","ATL",5.00,
2019-08-01,"DL","SEA","LAX",2.00,
2019-08-01,"DL","LAX","SEA",0.00,
2019-08-01,"DL","GSP","ATL",0.00,
2019-08-01,"DL","ATL","GSP",8.00,
2019-08-01,"DL","MSP","BOS",0.00,
2019-08-01,"DL","BOS","MSP",51.00,

查询表。

代码,描述
"02Q", "Titan Airways"
"04Q", "Tradewind Aviation"
"05Q", "Comlux Aviation, AG"
"06Q", "Master Top Linhas Aereas Ltd."
"07Q", "Flair Airlines Ltd."
"09Q", "Swift Air, LLC d/b/a Eastern Air Lines d/b/a Eastern"
"0BQ", "DCA"
"0CQ", "ACM AIR CHARTER GmbH"
"0FQ", "Maine Aviation Aircraft Charter, LLC"
"0GQ","Inter Island Airways, d/b/a Inter Island Air"
"0HQ", "Polar Airlines de Mexico d/b/a Nova Air"
"0J", "JetClub AG"
"0JQ", "Vision Airlines"
"0LQ", "Metropix UK, LLP."
"0MQ", "Multi-Aero, Inc. d/b/a Air Choice One"
"0OQ", "Open Skies"
"0Q", "Flying Service N.V."
"0QQ", "TAG Aviation (UK) Ltd."
"0RQ", "TAG Aviation Espana S.L."

安装Pandas和它的依赖项

除非你想从GitHub上查看Pandas并自己编译,否则你可以通过Pip软件包安装程序来安装Pandas。

pip install pandas

或者,如果你正在运行Anaconda Python发行版,你可以通过Conda安装Pandas。

conda install pandas

因为我同时安装了Python 2.7和Python 3.7,而且我想使用后者,我使用了pip3 install pandas ,并发现我的机器上已经有了Pandas。不过我还是把它升级了,因为我的版本已经有点老了。

martinheller@Martins-Retina-MacBook ~ % pip3 install pandas

[InfoWorld上还有:最好的免费在线PyTorch课程和教程] 。

合并数据的Python代码

在这一点上,代码几乎是自己写的。

import pandas as pd

如果我们在Python 3控制台中运行这些行,我们会得到。

相关的。

1 2 第1页 下一页

第1页,共2页

如何选择一个低代码开发平台