0

我正在尝试验证特定列的两个数据框之间的数据映射。我需要验证以下内容:

  1. 如果 df1 中特定列中的值与 df2 中特定列中的映射匹配。
  2. 如果 df1 中特定列中的值与 df2 中特定列中的指定映射不匹配 - df2 中的不同值。
  3. 如果 df1 中特定列中的值在 df2 中没有匹配项。

df1 看起来像这样:

cp_id cp_code
2A23 一个
2A24 D
3A45 G
7A96
2A30 R
6A18 ķ

df2 看起来像:

cp_type_id cp_type_code
2A23 8
2A24 7
3A45 3
2A44 1
6A18 8
4A08 2

数据映射由一组值组成,其中组合可以匹配集合中的任何值,如下所示:

  • df1 中的 ('A','C','F','K','M') 应映射到 df2 中的 (2, 8) - 2 或 8
  • df1 中的 ('B') 应映射到 df2 中的 4
  • df1 中的 ('D','G','I') 应映射到 df2 中的 7
  • df1 中的 ('T','U') 应映射到 df2 中的 (3,5) - 3 或 5

请注意,df1 的 cp_code 为 R 未映射,并且 3A45 不匹配。好消息是有一个唯一的标识符密钥可供使用。

首先,我为每个映射集创建了一个列表,并使用 merge 创建了一个语句来检查每个映射。我最终得到了每组 3 个列表和 3 个语句,我不确定这是否是正确的方法。

最后,我想将匹配项合并到一个我称为 match 的 df 中,将所有 no_matches 合并到另一个我称为 no_match 的 df 中,并将所有 no_mappings 合并到另一个我称为 no_mapping 的 df 中,如下所示:

匹配

cp_id cp_code cp_type_id cp_type_code
2A23 一个 2A23 8
2A24 D 2A24 7
6A18 ķ 6A18 8

不匹配

cp_id cp_code cp_type_id cp_type_code
3A45 G 3A45 3

无映射

cp_id cp_code cp_type_id cp_type_code
7A96
2A44 1
2A30 R
4A08 2

我很难让 no_match 起作用。这是我尝试过的不匹配的:

  1. 根据设置的 2 个代码过滤 df1
  2. 基于不在地图 2 代码中的过滤 df2
  3. 对于无映射,我使用 on='cp_id' 进行了 df 合并
    no_mapping_set2 = df1_filtered.merge(df2_filtered, on='cp_id', indicator = True)

使用上面的代码,例如,对于 cp_id = 'B',我得到了很多 cp_id = 'B' 的重复行,而不是只返回 1 行。

只是为了说明我的水平,我是 Python 的初学者。任何帮助,将不胜感激。

非常感谢您的参与。

4

0 回答 0