Pandas实现列元素映射到另一列对应实际位置的方法问询
实现方案
步骤1:构建对象到真实所属Place的映射
首先建立所有对象和其真实归属位置的查找字典,有两种实现方式可选:
方式1:遍历行实现(逻辑直观)
obj_place_map = {} for _, row in df.iterrows(): for obj in row['True position']: obj_place_map[obj] = row['Place']
方式2:explode实现(代码更简洁、性能更高)
obj_place_map = df.explode('True position').set_index('True position')['Place'].to_dict()
以上两种方式最终都会得到如下格式的映射字典:{'A':'X1', 'B':'X1', 'C':'X1', 'D':'X2', 'E':'X2', 'F':'X2', 'G':'X3', 'H':'X3'}
步骤2:生成Pos标注列
直接对Position difference列的每个元素遍历查找映射即可,代码如下:
df['Pos'] = df['Position difference'].apply(lambda diff_list: ','.join([obj_place_map[obj] for obj in diff_list]))
运行后即可得到你预期的Pos列结果。
步骤3:扩展实现误检间隔计算
若要计算误检位置和真实位置的间隔,先建立Place对应的位置序号映射,再做差值计算即可,示例代码如下:
# 按实际位置顺序定义Place对应的序号,可根据你的真实位置规则修改 place_order_map = {'X1': 1, 'X2': 2, 'X3': 3} # 计算每个误检对象的间隔 df['误检间隔'] = df.apply( lambda row: [abs(place_order_map[row['Place']] - place_order_map[p]) for p in row['Pos'].split(',')], axis=1 )
以X1行为例,最终得到的误检间隔值为[1,1],符合相邻区块间隔为1的需求。
内容的提问来源于stack exchange,提问作者Serge de Gosson de Varennes
相关产品推荐
相关产品推荐

