- How can I perform a (
INNER
| (LEFT
|RIGHT
|FULL
)OUTER
)JOIN
与熊猫? - 如何在合并后为缺失的行添加 NaN?
- 合并后如何摆脱 NaN?
- 我可以合并索引吗?
- 如何合并多个 DataFrame?
- 与熊猫交叉加入
merge
?join
?concat
?update
?谁?什么?为什么?!
… 和更多。我已经看到这些反复出现的问题询问熊猫合并功能的各个方面。今天,关于合并及其各种用例的大部分信息都分散在几十个措辞不当、无法搜索的帖子中。这里的目的是为后代整理一些更重要的观点。
本问答旨在成为有关常见 pandas 习语的一系列有用用户指南的下一部分(请参阅 这篇关于 pivoting 的文章和 关于 concatenation 的这篇文章,我稍后会谈到)。
请注意,这篇文章 并不是 要替代 文档,所以也请阅读!一些例子取自那里。
目录
为了方便访问。
合并基础 - 连接的基本类型(首先阅读此内容)
原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议
这篇文章旨在为读者提供 SQL 风格与 Pandas 合并的入门知识,如何使用它以及何时不使用它。
特别是,本文将介绍以下内容:
基础 - 连接类型(左、右、外、内)
这篇文章(以及我在这个线程上的其他帖子)不会经过:
说得够多了 - 告诉我如何使用
merge
!设置和基础
为简单起见,键列具有相同的名称(目前)。
INNER JOIN 表示为
要执行 INNER JOIN,请在左侧 DataFrame 上调用
merge
,指定右侧 DataFrame 和连接键(至少)作为参数。这仅返回来自
left
和right
的行,它们共享一个公共密钥(在本例中为“B”和“D”)。LEFT OUTER JOIN 或 LEFT JOIN 表示为
这可以通过指定
how='left'
来执行。仔细注意 NaN 的位置。如果您指定
how='left'
,则仅使用来自left
的键,并且来自right
的缺失数据被替换为 NaN。同样,对于 RIGHT OUTER JOIN 或 RIGHT JOIN 是…
…指定
how='right'
:在这里,使用来自
right
left
缺失数据被替换为 NaN。最后,对于 FULL OUTER JOIN ,由
指定
how='outer'
。这使用了两个帧中的键,并且为两个帧中的缺失行插入了 NaN。
该文档很好地总结了这些各种合并:
其他 JOIN - LEFT-Excluding、RIGHT-Excluding 和 FULL-Excluding/ANTI JOIN
如果您需要 LEFT-Excluding JOIN 和 RIGHT-Excluding JOIN 分两步。
对于 LEFT-Excluding JOIN,表示为
首先执行 LEFT OUTER JOIN,然后过滤来自
left
的行(不包括右边的所有内容),在哪里,
同样,对于 RIGHT-Excluding JOIN,
最后,如果您需要进行仅保留左侧或右侧键的合并,但不能同时保留两者(IOW,执行 ANTI-JOIN ),
你可以用类似的方式做到这一点——
键列的不同名称
If the key columns are named differently—for example,
left
haskeyLeft
, andright
haskeyRight
instead ofkey
—那么您必须指定left_on
和right_on
作为参数,而不是on
:避免输出中的重复键列
When merging on
keyLeft
fromleft
andkeyRight
fromright
, if you only want either of thekeyLeft
orkeyRight
(但不是两者)在输出中,您可以从设置索引开始作为初步步骤。将此与之前命令的输出(即
left2.merge(right2, left_on='keyLeft', right_on='keyRight', how='inner')
的输出)进行对比,您会注意到keyLeft
缺失。您可以根据将哪个帧的索引设置为键来确定要保留的列。这在执行某些 OUTER JOIN 操作时可能很重要。仅合并来自
DataFrames
之一的单列例如,考虑
如果您只需要合并“newcol”(没有任何其他列),您通常可以在合并之前只对列进行子集:
如果您正在执行 LEFT OUTER JOIN,则性能更高的解决方案将涉及
map
:如前所述,这类似于,但比
合并多个列
要加入多个列,请指定
on
的列表(或left_on
和right_on
,视情况而定)。或者,如果名称不同,
其他有用
merge*
操作和功能将 DataFrame 与索引上的 Series 合并:请参阅 此答案。
除了
merge
,DataFrame.update
和DataFrame.combine_first
在某些情况下也用于更新一个 DataFrame 与另一个。pd.merge_ordered
是有序 JOIN 的有用函数。pd.merge_asof
(阅读:merge_asOf)对于 近似 连接很有用。本节仅涵盖最基本的内容,旨在激发您的胃口。有关更多示例和案例,请参阅
merge
、join
和concat
的文档 以及函数规范的链接。继续阅读
跳转到 Pandas Merging 101 中的其他主题继续学习:
合并基础 - 连接的基本类型*
基于索引的连接
泛化到多个 DataFrame
交叉连接
*你在这里。