如何验证熊猫中 2 个数据帧之间的数据映射

问题描述

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

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

df1 看起来像这样:

cp_id cp_code
2A23 A
2A24 D
3A45 G
7A96 B
2A30 R
6A18 K

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
  • ('D','G','I') 在 df1 中应该映射到 df2 中的 7
  • df1 中的('T','U') 应该映射到 df2 中的 (3,5) - 3 或 5

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

首先,我为每个映射集创建了一个列表,并使用合并创建了一个语句来检查每个映射。我最终得到了 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 A 2A23 8
2A24 D 2A24 7
6A18 K 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 B NaN NaN
NaN NaN 2A44 1
2A30 R NaN NaN
NaN NaN 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 的初学者。任何帮助将不胜感激。

非常感谢您的时间。

罗布

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)