如何使用Pandas实现匹配实体映射与缺失/空值实体处理
完整实现方案:Pandas实体映射与多行拆分处理
问题背景
需要处理包含实体信息的DataFrame,遵循以下规则:
- 若
ent列的实体存在于ent_src列的实体集合中,将该实体映射为tgt_entity;若不存在则移除该行。 - 若
ent列值为空,将ent_src列的所有实体拆分后分别赋值给tgt_entity,生成多行数据。
原始数据
import pandas as pd data = pd.DataFrame({ 'id': [1, 1, 2, 2, 3], 'ent_src': ['TrdA, TrdB,C, D']*5, 'ent': ['TrdA', 'TrdB', 'TrdF', 'TrdXX', ''], 'col': ['aaaa', 'bbbb', 'ccc', 'ZZZZ', 'ggg'] })
完整实现代码
import pandas as pd # 原始数据 data = pd.DataFrame({ 'id': [1, 1, 2, 2, 3], 'ent_src': ['TrdA, TrdB,C, D']*5, 'ent': ['TrdA', 'TrdB', 'TrdF', 'TrdXX', ''], 'col': ['aaaa', 'bbbb', 'ccc', 'ZZZZ', 'ggg'] }) # 预处理:拆分ent_src为实体集合并清理空格,同时清理ent列空格 data['ent_src_clean'] = data['ent_src'].str.split(',').apply(lambda x: [s.strip() for s in x]) data['ent_clean'] = data['ent'].str.strip() # 处理规则1:ent不为空且存在于ent_src实体集合的行 case1 = data[data['ent_clean'] != ''].copy() case1 = case1[case1.apply(lambda row: row['ent_clean'] in row['ent_src_clean'], axis=1)] case1['tgt_entity'] = case1['ent_clean'] # 处理规则2:ent为空的行,拆分ent_src生成多行 case2 = data[data['ent_clean'] == ''].copy() case2 = case2.assign(tgt_entity=case2['ent_src_clean']).explode('tgt_entity') # 合并结果并调整列顺序 result = pd.concat([case1, case2], ignore_index=True) result = result[['id', 'ent_src', 'ent', 'col', 'tgt_entity']] # 输出最终结果 print(result)
代码逻辑说明
- 预处理:清理实体字符串中的空格,避免因空格导致的匹配失败,同时将
ent_src拆分为结构化的实体列表。 - 规则1处理:先筛选
ent非空的行,再校验实体是否存在于ent_src集合中,符合条件的直接映射实体到tgt_entity。 - 规则2处理:筛选
ent为空的行,通过assign绑定拆分后的实体列表,再用explode将列表拆分为多行数据。 - 结果合并:将两种规则的处理结果合并,调整列顺序后得到符合要求的输出。
运行结果
id ent_src ent col tgt_entity 0 1 TrdA, TrdB,C, D TrdA aaaa TrdA 1 1 TrdA, TrdB,C, D TrdB bbbb TrdB 2 3 TrdA, TrdB,C, D ggg TrdA 3 3 TrdA, TrdB,C, D ggg TrdB 4 3 TrdA, TrdB,C, D ggg C 5 3 TrdA, TrdB,C, D ggg D
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

