【问题标题】:Opposite of left outer join in pandas based on one column results in less records than expected [duplicate]与基于一列的熊猫左外连接相反,导致记录少于预期[重复]
【发布时间】:2022-01-08 03:18:55
【问题描述】:

我有以下两个数据框:

df2 有 2166 条唯一记录。

我正在尝试返回蓝色区域中的数据,因此我使用了以下技术:

要获得绿色数据,我只需执行内部连接:
df_common = df1.merge(df2, how='inner' on='SKU')
产生 413 条唯一记录

为了获得蓝色区域,我将绿色数据附加到df2:
df2_plus_green = df2.append(df_common, ignore_index = True)
产生 2579 条记录(这是有道理的 (413 + 2166 = 2579)

然后我删除了重复项:
df_blue = df2_plus_green.drop_duplicates(keep=False, subset=['SKU'])
产生 1666 条记录。我原以为它会产生 1753 条记录 (2166 - 413 = 1753)

我已经在一组更小的数据上尝试了上述技术,它按预期工作。我假设被删除的额外 87 条记录在某种程度上是重复的,但我已经在每个步骤中检查了每个数据帧,并且所有数据帧都由完全唯一的记录组成。谁能指出我正确的方向?我确信我错过了一些明显的东西。

【问题讨论】:

  • 请解释如何阅读图表。 dfs的列是什么? PS A minimal reproducible example 是调试问题的必填项。
  • 对不起,不够清晰。两个 df 都由相同的列组成,但我仅基于一列“SKU”合并和删除重复项,因此其他列无关紧要。 DF1 有 1519 条唯一记录,DF2 有 2166 条唯一记录。维恩图旨在解释字段之间有共同的记录,类似于 W3Schools 如何在页面中间的维恩图中解释内部连接如何工作:w3schools.com/sql/sql_join.asp
  • 请通过编辑而非 cmets 进行澄清。 PS 即使 dfs 具有相同的列,重要的是您要加入什么、键是什么以及是否有重复和空值。您确实需要详细说明您拥有和假设的具体情况,包括约束条件。 PS 你看到人们到处模仿的那些维恩图对于解释外部连接和内部连接是无用的和误导性的,而且对于解释内部连接也是如此。在其链接的问题页面上查看我的 Venn Diagram for Natural Join 和 cmets。

标签: python pandas dataframe inner-join


【解决方案1】:

当您合并两个表时,使用参数“Indicator”,它将告诉我们每个数据点是如何连接的。

df_right_only = pd.merge(df1, df2, on = "Common Column", how = "right", indicator = True)

然后我们可以使用 LOC 只过滤掉从右表中唯一拉出的值。

df_right_only.loc[df_right_only ['_merge'] == "right_only", 'Column that you want']

这种方法称为反连接。

【讨论】:

  • 当然。我已经做了。你能解释一下你为什么回答我的问题吗?为什么您的反连接方法导致的数字与我的不同(即 1753 与 1666)?
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多