Pandas Merging 101

Pandas Merging 101,第1张

Pandas Merging 101

这篇文章旨在为读者提供有关SQL风味的与熊猫的合并,使用方法以及何时不使用它的入门。

特别是,这是这篇文章的内容:

  • 基础知识-联接类型(左,右,外,内)

    • 与不同的列名合并
    • 与多列合并
    • 避免在输出中出现重复的合并键列
      该帖子(以及我在该主题上发布的其他帖子)将不会通过以下内容:

与性能相关的讨论和时间安排(目前)。在适当的地方,最引人注目的是提到更好的替代方案。
处理后缀,删除多余的列,重命名输出和其他特定用例。还有其他(阅读:更好)的帖子可以解决这个问题,所以请弄清楚!

注意
除非另有说明,否则大多数示例在演示各种功能时会默认使用INNER JOIN *** 作

此外,可以复制和复制此处的所有Dataframe,以便您可以使用它们。另外,请参阅这篇文章 ,了解如何从剪贴板读取Dataframe。

最后,所有JOIN *** 作的视觉表示都已使用Google绘图进行了手绘。从这里得到启示。

聊够了,只是告诉我如何使用merge!

设置和基础

np.random.seed(0)left = pd.Dataframe({'key': ['A', 'B', 'C', 'D'], 'value': np.random.randn(4)})    right = pd.Dataframe({'key': ['B', 'D', 'E', 'F'], 'value': np.random.randn(4)})left  key     value0   A  1.7640521   B  0.4001572   C  0.9787383   D  2.240893right  key     value0   B  1.8675581   D -0.9772782   E  0.9500883   F -0.151357

为了简单起见,键列具有相同的名称(目前)。

一个内连接由下式表示

注意:
此规则以及即将发布的附图均遵循以下约定:

蓝色表示合并结果中存在的行
红色表示从结果中排除(即删除)的行
绿色表示缺少的值将NaN在结果中替换为s
要执行INNER JOIN,请调用merge左侧的Dataframe,并指定右侧的Dataframe和连接键(至少)作为参数。

left.merge(right, on='key')# Or, if you want to be explicit# left.merge(right, on='key', how='inner')  key   value_x   value_y0   B  0.400157  1.8675581   D  2.240893 -0.977278

这仅返回来自left并right共享一个公共密钥的行(在此示例中为“ B”和“ D”)。

甲LEFT OUTER JOIN,或LEFT JOIN由下式表示

可以通过指定来执行how=’left’。

left.merge(right, on='key', how='left')  key   value_x   value_y0   A  1.764052       NaN1   B  0.400157  1.8675582   C  0.978738       NaN3   D  2.240893 -0.977278

请仔细注意NaN的位置。如果指定how=’left’,则仅left使用from的键,而缺失的数据right被NaN代替。

同样,对于RIGHT OUTER JOIN或RIGHT JOIN来说…

…指定how=’right’:

left.merge(right, on='key', how='right')  key   value_x   value_y0   B  0.400157  1.8675581   D  2.240893 -0.9772782   E       NaN  0.9500883   F       NaN -0.151357

在这里,right使用了from的键,而缺失的数据left被NaN代替。

最后,对于

FULL OUTER JOIN
,由

指定

how='outer'

left.merge(right, on='key', how='outer')  key   value_x   value_y0   A  1.764052       NaN1   B  0.400157  1.8675582   C  0.978738       NaN3   D  2.240893 -0.9772784   E       NaN  0.9500885   F       NaN -0.151357

这将使用两个框架中的关键点,并且会为两个框架中缺少的行插入NaN。

该文档很好地总结了这些各种合并:

在此处输入图片说明

其他联接-左排除,右排除和全排除/ ANTI联接
如果您需要分两个步骤进行LEFT-Exclusive JOIN和RIGHT-Exclusive JOIN。

对于不包括JOIN的LEFT,表示为

首先执行LEFT OUTER JOIN,然后过滤(不包括!)left仅来自的行,

(left.merge(right, on='key', how='left', indicator=True)     .query('_merge == "left_only"')     .drop('_merge', 1))  key   value_x  value_y0   A  1.764052      NaN2   C  0.978738      NaN

哪里,

left.merge(right, on='key', how='left', indicator=True)  key   value_x   value_y     _merge0   A  1.764052       NaN  left_only1   B  0.400157  1.867558       both2   C  0.978738       NaN  left_only3   D  2.240893 -0.977278       both

同样,对于除权利加入之外,

(left.merge(right, on='key', how='right', indicator=True)     .query('_merge == "right_only"')     .drop('_merge', 1))  key  value_x   value_y2   E      NaN  0.9500883   F      NaN -0.151357

最后,如果您需要执行合并 *** 作,该合并 *** 作仅保留左侧或右侧的键,而不同时保留两者(IOW,执行ANTI-JOIN),

您可以通过类似的方式进行 *** 作-

(left.merge(right, on='key', how='outer', indicator=True)     .query('_merge != "both"')     .drop('_merge', 1))  key   value_x   value_y0   A  1.764052       NaN2   C  0.978738       NaN4   E       NaN  0.9500885   F       NaN -0.151357

键列的不同名称

如果键列的名称不同(例如,lefthaskeyLeft和righthaskeyRight代替),key则必须指定left_on和right_on作为参数,而不是on:

left2 = left.rename({'key':'keyLeft'}, axis=1)right2 = right.rename({'key':'keyRight'}, axis=1)left2  keyLeft     value0       A  1.7640521       B  0.4001572       C  0.9787383       D  2.240893right2  keyRight     value0        B  1.8675581        D -0.9772782        E  0.9500883        F -0.151357left2.merge(right2, left_on='keyLeft', right_on='keyRight', how='inner')  keyLeft   value_x keyRight   value_y0       B  0.400157        B  1.8675581       D  2.240893        D -0.977278

避免在输出中重复键列
在keyLeftfromleft和keyRightfrom上进行合并时right,如果仅希望在输出中使用keyLeft或keyRight(但不同时使用)中的任何一个,则可以从将索引设置为初步步骤开始。

left3 = left2.set_index('keyLeft')left3.merge(right2, left_index=True, right_on='keyRight')    value_x keyRight   value_y0  0.400157        B  1.8675581  2.240893        D -0.977278

将此与之前的命令输出(即的输出left2.merge(right2, left_on=’keyLeft’, right_on=’keyRight’, how=’inner’))进行对比,您会keyLeft发现丢失了。您可以根据将哪个帧的索引设置为关键来确定要保留的列。例如,当执行某些OUTER JOIN *** 作时,这可能很重要。

仅合并其中一个的单个列 Dataframes
例如,考虑

right3 = right.assign(newcol=np.arange(len(right)))right3  key     value  newcol0   B  1.867558       01   D -0.977278       12   E  0.950088       23   F -0.151357       3

如果只需要合并“ new_val”(不包含任何其他列),则通常可以在合并之前仅对子集进行子集化:

left.merge(right3[['key', 'newcol']], on='key')  key     value  newcol0   B  0.400157       01   D  2.240893       1

如果您要进行左外部联接,则性能更高的解决方案将涉及map:

# left['newcol'] = left['key'].map(right3.set_index('key')['newcol']))left.assign(newcol=left['key'].map(right3.set_index('key')['newcol']))  key     value  newcol0   A  1.764052     NaN1   B  0.400157     0.02   C  0.978738     NaN3   D  2.240893     1.0

如前所述,这类似于但比

left.merge(right3[['key', 'newcol']], on='key', how='left')  key     value  newcol0   A  1.764052     NaN1   B  0.400157     0.02   C  0.978738     NaN3   D  2.240893     1.0

合并多列

要加入对多列,指定列表on(或

left_on
right_on
,如适用)。

left.merge(right, on=['key1', 'key2'] ...)

或者,如果名称不同,

left.merge(right, left_on=['lkey1', 'lkey2'], right_on=['rkey1', 'rkey2'])

其他有用的merge* *** 作和功能

  • 合并带有Seri​​es on index的Dataframe:参见此答案。

  • 此外merge,Dataframe.update和Dataframe.combine_first也用在某些情况下,更新一个数据帧与另一个。

  • pd.merge_ordered
    对有序的JOIN是有用的函数。

  • pd.merge_asof
    (阅读:merge_asOf)对于近似联接很有用。

本部分仅涵盖最基本的内容,旨在仅提高您的食欲。更多的例子和案例,看到的文档merge,join以及concat还有链接的功能规格。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5655204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存