【问题标题】:Pandas Left Merge / Join not Resulting in what is expected for left join熊猫左合并/加入未导致左加入的预期结果
【发布时间】:2015-12-18 02:47:33
【问题描述】:

所以我可能根本不知道什么是左连接,因为我被绊倒了……这是我对左连接的定义:

在输出表中包括左表和右表中的匹配记录和左表中的不匹配记录。

这是我的例子:

In[87]: df1 = DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'], 'data1': range(6)})

In[88]: df2 = DataFrame({'key': ['a', 'b', 'a', 'b', 'd'], 'data2': range(5)})

In[89]: pd.merge(df1, df2, on='key', how='left')

Out[86]: 
    data1 key  data2
0       0   b      1
1       0   b      3
2       1   b      1
3       1   b      3
4       2   a      0
5       2   a      2
6       3   c    NaN
7       4   a      0
8       4   a      2
9       5   b      1
10      5   b      3

但是!!!我希望得到这个:

    data1 key  data2
0       0   b      1
1       1   b      1
2       2   a      0
3       3   c      NaN
4       4   a      0
5       5   b      1

我的一般想法来自交易数据(例如我可能正在合并抬头和项目详细信息的会计凭证,或合并查找数据)。

我的想法或代码中缺少什么来完成这项工作?

PS - 这来自于 Wes McKinney 的 Python for Data Analysis 一书(第 179 页) - 他在其中提到了以下内容:

多对多合并具有定义明确但不一定直观的行为。多对多连接形成行的笛卡尔积。由于左侧 DataFrame 中有 3 'b' 行,右侧有 2 行,因此结果中有 6 'b' 行。

我想我错过了这里的重点?

【问题讨论】:

  • 我不明白您的预期输出。第一个数据帧中的第一个 b 与第二个数据帧中位置 1 的 b 和位置 3 的 b 匹配。在进行左连接时,为什么只期望第一个配对而不期望第二个配对?
  • 来自我的 exp 行业产品 ACL。我对此的定义是“多对一连接将主键值匹配到仅匹配辅助键值的第一次出现。如果存在匹配的辅助键值的其他匹配项,则它们将被忽略。我对左表(主表)保持不变并且只引入匹配值的想法很感兴趣(但结果中保留了不匹配的初选,结果为 NaN - 因为它是不匹配的)。

标签: python join pandas merge


【解决方案1】:

获得预期输出的一种方法是按data1 分组并获取每个组的第一个值:

g = df.groupby('data1').first().reset_index()

返回:

   data1 key  data2
0      0   b      1
1      1   b      1
2      2   a      0
3      3   c    NaN
4      4   a      0
5      5   b      1

希望对您有所帮助。

【讨论】:

  • 这需要先计算完整的左连接。如果速度很关键,这可能不是最佳解决方案。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2021-05-11
  • 2017-05-30
  • 2017-03-10
相关资源
最近更新 更多