如何将Pandas中无效索引值替换为NaN并保留有效数据位置?
问题描述
我目前使用以下代码:
originalmsg['async'] = originalmsg.rename(index=fpsdata.set_index('index')['name']).index originalmsg['async time'] = originalmsg.rename(index=fpsdata.set_index('index')['start_time']).index originalmsg['async data'] = originalmsg.rename(index=fpsdata.set_index('index')['data']).index
运行后生成的DataFrame中,async、async time、async data列的有效数据位置正确,但无数据的位置被填充了原索引数字,想将这些数字替换为NaN,请问有实现方法吗?
解决方案
你现在的写法是通过重命名整个索引再赋值,未匹配的索引会保留原数值,换用映射替换或索引合并的方式就能自动把未匹配项设为NaN,同时保留有效数据的位置。
方法1:用map实现映射替换
先从fpsdata构建索引到对应字段的映射字典,再用index.map()完成替换:
# 构建index到name的映射,赋值给async列 name_map = fpsdata.set_index('index')['name'].to_dict() originalmsg['async'] = originalmsg.index.map(name_map) # 同理处理async time列 time_map = fpsdata.set_index('index')['start_time'].to_dict() originalmsg['async time'] = originalmsg.index.map(time_map) # 同理处理async data列 data_map = fpsdata.set_index('index')['data'].to_dict() originalmsg['async data'] = originalmsg.index.map(data_map)
方法2:用join合并(效率更高)
直接将fpsdata以index为键,和originalmsg按索引合并,再提取对应列赋值:
# 按索引合并两个表,只保留需要的字段 merged_df = originalmsg.join(fpsdata.set_index('index')[['name', 'start_time', 'data']]) # 将合并后的字段重命名并赋值给原表 originalmsg[['async', 'async time', 'async data']] = merged_df[['name', 'start_time', 'data']]
两种方法都会自动把originalmsg索引中,在fpsdata的index列里不存在的项设为NaN,完全符合你的需求。另外注意你原代码里的语法错误,fpsdata.set_index('index'['start_time'])括号不匹配,上面的代码已经做了修正。
内容的提问来源于stack exchange,提问作者Achen
相关产品推荐
相关产品推荐

