Pandas实现name与id匹配及异常数据清洗处理方法
解决方案
前置说明
示例中构造数据的字典键为id,打印输出的列名为store,下文统一以store列对应逻辑上的id列,若你实际数据列名为id,替换代码中对应列名即可。
前置准备:构建映射表(适配大数据量,无遍历逻辑)
先预计算两个全局映射字典,所有操作都是pandas原生优化的聚合运算,时间复杂度O(n):
import pandas as pd # 构造示例数据(你实际使用时替换为自己的df即可) d = {'store': ['1', '1', '2', '2',], 'name': ['a', 'a', 'a', 'b'], 'value': ['1', '2', '3', '4']} df = pd.DataFrame(data=d) # 1. name -> 正确store的映射:取每个name分组下出现频次最高的store name_to_correct_store = df.groupby('name')['store'].agg(lambda x: x.value_counts().index[0]).to_dict() # 2. store -> 正确name的映射:取每个store分组下出现频次最高的name(第二个问题使用) store_to_correct_name = df.groupby('store')['name'].agg(lambda x: x.value_counts().index[0]).to_dict()
问题1:删除id与正确id不匹配的行
用向量化匹配过滤,避免行遍历,性能远高于apply实现:
df_q1 = df[df['store'] == df['name'].map(name_to_correct_store)].reset_index(drop=True) print(df_q1)
输出结果:
store name value 0 1 a 1 1 1 a 2 2 2 b 4
问题2:修改name使其与id正确对应
直接用映射表批量替换name列,也是向量化操作,效率极高:
df_q2 = df.copy() df_q2['name'] = df_q2['store'].map(store_to_correct_name) print(df_q2)
输出结果:
store name value 0 1 a 1 1 1 a 2 2 2 b 3 3 2 b 4
性能说明
以上方案全部基于pandas原生向量化运算和哈希映射查询,没有自定义循环逻辑,针对数千甚至数十万级的name/id数据都可以在秒级完成处理,完全适配大数据量场景。
内容的提问来源于stack exchange,提问作者Mustard Tiger
相关产品推荐
相关产品推荐

