问题描述
我正在尝试验证特定列的两个数据框之间的数据映射。我需要验证以下内容:
- 如果 df1 中特定列中的值与 df2 中特定列中的映射匹配。
- 如果 df1 中特定列中的值与 df2 中特定列中的指定映射不匹配 - df2 中的不同值。
- 如果 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 起作用。 这是我尝试不匹配的方法:
no_mapping_set2 = df1_filtered.merge(df2_filtered,on='cp_id',indicator = True)
使用上面的代码,例如,对于 cp_id = 'B',我得到了很多 cp_id = 'B' 的重复行,而不是只返回 1 行。
为了说明我的水平,我是 Python 的初学者。任何帮助将不胜感激。
非常感谢您的时间。
罗布
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)