我正在尝试验证特定列的两个数据框之间的数据映射。我需要验证以下内容:
- 如果 df1 中特定列中的值与 df2 中特定列中的映射匹配。
- 如果 df1 中特定列中的值与 df2 中特定列中的指定映射不匹配 - df2 中的不同值。
- 如果 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 起作用。这是我尝试过的不匹配的:
- 根据设置的 2 个代码过滤 df1
- 基于不在地图 2 代码中的过滤 df2
- 对于无映射,我使用 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 的初学者。任何帮助,将不胜感激。
非常感谢您的参与。
抢