- 如何对Pandas进行(
INNER
|(LEFT
|RIGHT
|FULL
)OUTER
)JOIN
? - 如何在合并后为缺少的行添加NAN?
- 合并后如何摆脱NAN?
- 我可以在索引上合并吗?
- 如何合并多个DataFrame?
- 与Pandas交叉加入
merge
?join
?concat
?update
?谁?什么?为什么?!
..。还有更多。我见过这些反复出现的问题,询问Pandas合并功能的各个方面。今天,关于Merge及其各种用例的大部分信息都分散在数十篇措辞拙劣、无法搜索的帖子中。这里的目的是为子孙后代整理一些更重要的观点。
这篇问答是关于Pandas常见习语的一系列有用的用户指南中的下一篇(参见this post on pivoting和this post on concatenation,我将在后面讨论它们)。
请注意,这篇文章并不是要取代the documentation,所以请也读一读!其中一些例子就是从那里取来的。
目录
为了便于访问。
8条答案
按热度按时间ubbxdtey1#
这篇文章旨在为读者提供一本关于与Pandas合并的入门读物,如何使用它,以及何时不使用它。
特别是,以下是这篇帖子将经历的:
基础-连接类型(左、右、外、内)
合并不同列名
合并多列
避免在输出中出现重复的合并键列
这篇帖子(以及我在这个帖子上的其他帖子)不会经历的:
注除非另有说明,否则大多数示例在演示各种功能时默认使用内连接操作。
此外,这里的所有DataFrame都可以复制和复制,这样您就可以玩它们了。此外,请参阅this post以了解如何从剪贴板中读取DataFrame。
最后,连接操作的所有可视化表示都是使用Google Drawing手绘的。灵感来自here。
说够了--教我怎么用
merge
就行了!设置与基础
为简单起见,键列具有相同的名称(目前)。
内部联接由
注这一点以及即将公布的数字都遵循这一惯例:
NaN
s的缺失值要执行内部联接,请在左边的DataFrame上调用
merge
,并将右边的DataFrame和联接键(至少)指定为参数。这只返回
left
和right
中共享公用键(在本例中为“B”和“D”)的行。左外部联接,或左联接由表示
这可以通过指定
how='left'
来执行。请仔细注意此处放置的NaN。如果指定
how='left'
,则只使用left
中的密钥,而right
中缺少的数据将替换为NaN。同样,对于右外部联接,或右联接,它是...
...指定
how='right'
:这里使用了
right
中的密钥,并用NaN替换了left
中缺失的数据。最后,对于完全外连接,由
指定
how='outer'
。这使用了两个帧中的关键点,并为这两个帧中缺少的行插入了NAN。
文档很好地总结了这些不同的合并:
其他联接--左排除、右排除、全排除/反联接
如果您需要左排除JOIN和右排除JOIN两个步骤。
对于左排除联接,表示为
首先执行左外部联接,然后只过滤来自
left
的行(排除来自右侧的所有行),哪里,
类似地,对于排除权限的联接,
最后,如果需要进行只保留来自左侧或右侧的键的合并,而不是同时保留这两个键(IOW,执行反联接),
你可以用类似的方式来做这个-
键列名称不同
如果键列的名称不同-例如,
left
具有keyLeft
,而right
具有keyRight
而不是key
-则必须指定left_on
和right_on
作为参数,而不是on
:输出避免重复键列
合并
left
中的keyLeft
和right
中的keyRight
时,如果您只需要输出中的keyLeft
或keyRight
中的一个(而不是两者),则可以首先设置索引作为初步步骤。将其与前面命令的输出(即
left2.merge(right2, left_on='keyLeft', right_on='keyRight', how='inner')
的输出)进行对比,您会注意到缺少keyLeft
。您可以根据将哪个帧的索引设置为键来确定要保留哪一列。比方说,当执行某些外部联接操作时,这可能很重要。只合并
DataFrames
中的一列例如,考虑
如果您只需要合并“NEWCOL”(不合并任何其他列),您通常可以在合并之前只对列进行子集:
如果您正在执行左外部联接,则性能更好的解决方案将涉及
map
:如前所述,这类似于,但比
多列合并
要联接多个列,请为
on
(或left_on
和right_on
,视情况而定)指定列表。或者,如果名字不同,
其他有用的
merge*
操作和函数merge
,DataFrame.update
和DataFrame.combine_first
在某些情况下也用于用一个DataFrame更新另一个DataFrame。pd.merge_ordered
是有序连接的有用函数。pd.merge_asof
(读:merge_asof)对于近似联接非常有用。本部分仅涵盖最基本的内容,旨在满足您的胃口。有关更多示例和用例,请参阅documentation on
merge
,join
, andconcat
以及指向功能规范的链接。继续阅读
跳到Pandas合并101中的其他主题继续学习:
Merging basics - basic types of joins*
Index-based joins
Generalizing to multiple DataFrames
Cross join
你在这里。
h7wcgrx32#
pd.concat([df0, df1], kwargs)
的补充视觉视图。请注意,kwargaxis=0
或axis=1
的含义不像df.mean()
或df.apply(func)
那样直观8ehkhllq3#
加入101
这些动画可能会更好地从视觉上解释你。片酬:Garrick Aden-Buie tidyexplain repo
内联接
外联接或全联接
右联
左联接
qojgxg4l4#
在这个回答中,我将考虑实际例子。
第一个是
pandas.concat
。第二种是将一个索引中的 Dataframe 与另一个索引中的列进行合并。
1。
pandas.concat
考虑以下具有相同列名的
DataFrames
:2018年前大小(8784,5)
Preco 2019,大小(8760,5)
具有相同列名的。
您可以使用
pandas.concat
将它们组合在一起,只需这会产生一个大小如下的DataFrame(17544,5)
如果你想形象化,它最终是这样工作的
(Source)
2。按列和索引合并
在这一部分中,我将考虑一个具体的案例:如果想要合并一个 Dataframe 的索引和另一个 Dataframe 的列。
假设其中一个 Dataframe
Geo
具有54列,是日期Data
列之一,其类型为datetime64[ns]
。和 Dataframe
Price
,其中有一列包含价格,索引对应于日期在本例中,要合并它们,可以使用
pd.merge
这会产生以下 Dataframe
lf5gs5x25#
这篇文章将涉及以下主题:
在不同条件下与指数合并
基于索引的联接选项:
merge
、join
、concat
对索引进行合并
对一个索引、另一个列进行合并
有效地使用命名索引简化合并语法
BACK TO TOP
基于索引的联接
TL;DR
有几个选项,根据用例的不同,有些选项比其他选项更简单。
使用
left_index
和right_index
的DataFrame.merge
(或使用命名索引的left_on
和right_on
)支持内/左/右/全
一次只能加入两个
支持列-列、索引-列、索引-索引联接
DataFrame.join
(索引联接)支持内/左(默认)/右/全
一次可以加入多个DataFrame
支持索引-索引联接
pd.concat
(索引联接)支持内部/完全(默认)
一次可以加入多个DataFrame
支持索引-索引联接
索引到索引联接
设置与基础知识
通常,索引上的INTER JOIN如下所示:
其他联接遵循类似的语法。
值得注意的替代方案
1.**
DataFrame.join
**默认为索引联接。默认情况下,DataFrame.join
执行左外部联接,因此这里需要how='inner'
。请注意,我需要指定
lsuffix
和rsuffix
参数,否则join
将出错:因为列名是相同的。如果它们的名字不同,这不会是一个问题。
1.**
pd.concat
**连接索引,一次可以连接两个或多个DataFrame。默认情况下,它执行完全的外连接,因此这里需要how='inner'
。有关
concat
的更多信息,请参阅此帖子。列联接索引
要使用左列右列的索引执行内连接,您将使用
DataFrame.merge
,left_index=True
和right_on=...
的组合。其他连接遵循类似的结构。请注意,只有
merge
可以执行索引到列的联接。如果左侧的索引级数等于右侧的列数,则可以联接多个列。join
和concat
不能混合合并。您需要使用DataFrame.set_index
将索引设置为前置步骤。有效使用命名索引[Pandas>=0.23]
如果您的索引已命名,则从PANDA>=0.23开始,
DataFrame.merge
允许您将索引名指定为on
(或根据需要指定left_on
和right_on
)。对于前面与索引Left,Column of Right合并的示例,您可以使用索引名称为Left的
left_on
:继续阅读
跳到Pandas合并101中的其他主题继续学习:
Merging basics - basic types of joins
Index-based joins*
Generalizing to multiple DataFrames
Cross join
你在这里
qlzsbp2j6#
这篇文章将涉及以下主题:
merge
在这里有缺点)BACK TO TOP
泛化为多个DataFrame
通常,当要将多个DataFrame合并在一起时会出现这种情况。很简单,这可以通过链接
merge
调用来实现:然而,对于许多DataFrame来说,这很快就失去了控制。此外,可能有必要对未知数量的DataFrame进行概括。
在这里,我介绍
pd.concat
用于唯一键上的多路联接,DataFrame.join
用于非唯一键上的多路联接。首先,是设置。唯一键多路合并
如果您的键(这里的键可以是列或索引)是唯一的,则可以使用
pd.concat
。请注意,pd.concat
在索引上加入DataFrames。对于完全外部联接,省略
join='inner'
。请注意,您不能指定左连接或右连接(如果需要,请使用join
,如下所述)。重复键多路合并
concat
速度快,但也有缺点。它不能处理重复项。在这种情况下,我们可以使用
join
,因为它可以处理非唯一键(请注意,join
在它们的索引上联接DataFrame;它在幕后调用merge
并执行左外部联接,除非另有指定)。继续阅读
跳到Pandas合并101中的其他主题继续学习:
Merging basics - basic types of joins
Index-based joins
Generalizing to multiple DataFrames*
Cross join
你在这里
ssgvzors7#
Pandas目前不支持合并语法中的不平等连接;一个选项是使用pyjanitor中的CONDITIONAL_JOIN函数-我是这个库的贡献者:
这些列作为元组的变量参数传递,每个元组由左 Dataframe 中的列、右 Dataframe 中的列和联接操作符组成,连接操作符可以是
(>, <, >=, <=, !=)
中的任何一个。在上面的示例中,由于列名重叠,返回了一个多索引列。在性能方面,这比幼稚的交叉连接要好:
ccrfmcuu8#
我认为你应该在你的解释中包括这一点,因为这是一种我经常看到的相关合并,我认为它被称为
cross-join
。这是当唯一的df没有共享列时发生的合并,它只是并排合并2个df:设置:
这将创建一个虚拟的X列,在X上合并,然后将其删除以生成
DF_MERMERED: