首页 > 解决方案 > 将 DataFrame 与多对多合并

问题描述

我有 2 个包含示例的 DataFrame,我想看看 DataFrame 2 中是否存在 DataFrame 1 的示例。

通常我会聚合每个示例的行并简单地合并 DataFrame。不幸的是,合并必须使用“匹配表”完成,该表在键之间具有多对多关系(id_low 与 id_high)。

简化示例

匹配表:

在此处输入图像描述

输入数据帧

在此处输入图像描述

因此,它们可以像这样匹配:

在此处输入图像描述

预期输出:

在此处输入图像描述

简化示例(用于 Python)

import pandas as pd

# Dataframe 1 - containing 1 Example
d1 = pd.DataFrame.from_dict({'Example': {0: 'Example 1', 1: 'Example 1', 2: 'Example 1'},
 'id_low': {0: 1, 1: 2, 2: 3}})

# DataFrame 2 - containing 1 Example
d2 = pd.DataFrame.from_dict({'Example': {0: 'Example 2', 1: 'Example 2', 2: 'Example 2'},
 'id_low': {0: 1, 1: 4, 2: 6}})

# DataFrame 3 - matching table
dm = pd.DataFrame.from_dict({'id_low': {0: 1, 1: 2, 2: 2, 3: 3, 4: 3, 5: 4, 6: 5, 7: 6, 8: 6},
 'id_high': {0: 'A',
  1: 'B',
  2: 'C',
  3: 'D',
  4: 'E',
  5: 'B',
  6: 'B',
  7: 'E',
  8: 'F'}})

如上所示,d1 和 d2 是可匹配的。

预期输出(或类似):

df_output = pd.DataFrame.from_dict({'Example': {0: 'Example 1'}, 'Example_2': {0: 'Example 2'}})

失败的尝试

与匹配的表翻译值聚合然后合并。考虑使用正则表达式和 OR 运算符。

标签: pythonpandas

解决方案


国际大学联盟:

d2.merge(dm)
  .merge(d1.merge(dm), on='id_high')\
  .groupby(['Example_x','Example_y'])['id_high'].agg(list)\
  .reset_index()

输出:

   Example_x  Example_y    id_high
0  Example 2  Example 1  [A, B, E]

推荐阅读