按指定顺序从Pandas DataFrame中提取对应labels值的高效方法
按指定文件名列表顺序提取Pandas DataFrame对应labels的高效实现方法
首先修正示例代码的小疏漏:构造dat数组时文件名漏写了.分隔符,和mylist、输出示例的文件名格式不匹配,修正后的构造代码为:
dat = np.array([(1, 2, 1, 1, 2, 2), ('a2.jpeg', 'a1.jpeg', 'c2.jpeg', 'b2.jpeg', 'b1.jpeg' , 'c1.jpeg')])
最高效实现方案
优先使用Pandas内置的set_index+reindex方案,依托Pandas索引的哈希查找特性,时间复杂度为O(n),远优于遍历匹配、条件筛选等实现,小数据量和百万级以上大数据量场景下性能表现都极佳:
# 核心实现(输出结果按mylist顺序排列) res = df.set_index('filenames').reindex(mylist)['labels'].astype(int).tolist()
示例运行后得到的res结果为[2, 1, 2, 1, 2, 1],完全匹配mylist的顺序要求。
扩展优化
- 若存在
mylist内的文件名不在df的filenames列中的情况,可指定填充值避免报错:# 未匹配到的项填充默认值-1 res = df.set_index('filenames').reindex(mylist, fill_value=-1)['labels'].astype(int).tolist() - 若偏好Python原生操作,也可以先构造映射字典再推导生成列表,性能同样优异:
label_map = df.set_index('filenames')['labels'].to_dict() res = [int(label_map[name]) for name in mylist]
内容的提问来源于stack exchange,提问作者Angus Campbell
相关产品推荐
相关产品推荐

