【问题标题】:What is the difference between 'pd.concat([df1, df2], join='outer')', 'df1.combine_first(df2)', 'pd.merge(df1, df2)' and 'df1.join(df2, how='outer')'? [duplicate]'pd.concat([df1, df2], join='outer')', 'df1.combine_first(df2)', 'pd.merge(df1, df2)' 和 'df1.join(df2) 有什么区别,如何='外部')'? [复制]
【发布时间】:2020-09-26 22:21:15
【问题描述】:

假设我有以下 2 个熊猫数据框:

import pandas as pd

A = [174,-155,-931,301]
B = [943,847,510,16]
C = [325,914,501,884]
D = [-956,318,319,-83]

E = [767,814,43,-116]
F = [110,-784,-726,37]
G = [-41,964,-67,-207]
H = [-555,787,764,-788]

df1 = pd.DataFrame({"A": A, "B": B, "C": C, "D": D})
df2 = pd.DataFrame({"E": E, "B": F, "C": G, "D": H})

如果我使用join=outer 执行concat,我会得到以下结果数据框:

pd.concat([data1,data2], join='outer')

如果我这样做df1.combine_first(df2),我会得到以下信息:

df1.set_index('B').combine_first(df2.set_index('B')).reset_index()

如果我执行pd.merge(df1, df2),我会得到以下与concat 产生的结果相同的结果:

pd.merge(data1, data2, on=['B','C','D'], how='outer')

最后,如果我执行df1.join(df2, how='outer'),我会得到以下信息:

df1.join(df2, how='outer', on='B', lsuffix='_left', rsuffix='_right')

我不完全理解每种方法产生不同结果的方式和原因。

【问题讨论】:

  • @LazyCoder 不完全,不。因为您发布的问题仅询问merge vs concat,而我的问题除了merge vs concat之外还询问join vs combine_first
  • 你问了很多事情。如果你不知道它们是什么,你为什么要问“差异”?--找出每个是什么。如果您认为您知道它们是什么,那么您如何需要“差异”-这甚至意味着什么?无论哪种方式,都给出定义,展示和应用研究并询问 1 个明确的特定非重复问题,关于您是如何被困在特定点上的。 How to Ask
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。

标签: python pandas dataframe join concatenation


【解决方案1】:

concat: 追加一个数据帧沿给定轴添加到另一个数据帧(默认 axix=0 表示沿索引连续,即将其他数据帧放在给定数据帧下方)。数据在另一个轴上对齐(即默认设置对齐列)。这就是我们在不匹配的“A”和“E”列中得到 NaN 的原因。

combine_first用其他数据框中的现有值替换数据框中的 NaN,其中行和列是池化的(来自两个数据框的行和列的联合)。在您的示例中,从一开始就没有缺失值,但它们是由于联合操作而出现的,因为您的索引没有公共条目。行的顺序由排序的组合索引(df1.B 和 df2.B)产生。
因此,如果您的数据框中没有缺失值,您通常不会使用 combine_first。

merge 是两个数据框的数据库样式组合,在如何合并(左、右、特定列)方面提供了比 concat 更多的选项。在您的示例中,结果的数据是相同的,但是 concat 和 merge 之间的索引存在差异:合并列时,数据帧索引将被忽略并创建一个新索引。

join 合并 df1 和 df2 在 df1 的索引上给定列(在示例 'B' 中)df2 .在您的示例中,这与pd.merge(df1, df2, left_on=df1.index, right_on='B', how='outer', suffixes=('_left', '_right')) 相同。由于 df1 的索引和 df2 的列 'B' 不匹配,由于外部连接,将会有很多 NaN。

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多