如何遍历DataFrame列中重复值并验证对应单位值匹配?
解决方案:基于Code分组匹配对应Length的Value
核心思路
由于每个code固定对应两个length字符串,我们可以先为每个code建立length与value的映射关系,再对比同一code下两个length对应的value是否一致,最终生成二进制标记列,全程无需解析length的数值或单位。
步骤与代码示例
1. 构造示例数据(模拟你的场景)
import pandas as pd data = { 'code': ['111ab', '111ab', '222cd', '222cd', '333ef', '333ef'], 'length': ['800 mm', '31,0 in', '1000 mm', '39,4 in', '500 mm', '19,7 in'], 'value': [100, 100, 200, 200, 300, 350] # 最后一组value不匹配,用于测试 } df = pd.DataFrame(data)
2. 生成Code-Length-Value映射字典
通过分组操作,为每个code建立对应的length到value的映射:
# 按code分组,生成每个code对应的length-value字典 code_length_map = df.groupby('code').apply( lambda x: x.set_index('length')['value'].to_dict() ).to_dict()
3. 生成匹配标记列
定义函数遍历每一行,对比当前行value与同一code下另一个length对应的value,一致则标记为1,否则为0:
def check_value_match(row): code = row['code'] current_length = row['length'] # 获取当前code对应的所有length-value对 length_value_pairs = code_length_map[code] # 提取当前length之外的另一个value other_value = [v for k, v in length_value_pairs.items() if k != current_length][0] # 返回二进制匹配结果 return 1 if row['value'] == other_value else 0 # 新增match列 df['match'] = df.apply(check_value_match, axis=1)
4. 结果展示
运行后得到的DataFrame如下:
| code | length | value | match |
|---|---|---|---|
| 111ab | 800 mm | 100 | 1 |
| 111ab | 31,0 in | 100 | 1 |
| 222cd | 1000 mm | 200 | 1 |
| 222cd | 39,4 in | 200 | 1 |
| 333ef | 500 mm | 300 | 0 |
| 333ef | 19,7 in | 350 | 0 |
补充说明
- 该方案完全基于给定的映射关系对比,不涉及任何
length字符串的解析,适配特殊取整或自定义单位的场景 - 假设每个
code严格对应2个length值,如果存在code对应多个length的情况,需要调整other_value的提取逻辑(比如增加长度判断) - 若需处理
code仅对应1个length的异常场景,可在函数中添加判断,返回NaN或自定义标记
内容的提问来源于stack exchange,提问作者Egorsky
相关产品推荐
相关产品推荐

