Python 3:高效获取Pandas DataFrame指定列对应值的索引名
高效获取大规模DataFrame中指定ID对应的索引列表
嘿,我太懂你现在的崩溃了——用Python循环处理200万行的DataFrame,每次还得做全表筛选,这速度慢到让人怀疑人生完全正常!咱们直接用Pandas的矢量化原生操作,把速度拉满,分分钟解决问题。
最优方案:用isin()做矢量化筛选
这是最直接且高效的方法,Pandas底层用C实现了这些操作,完全避开Python循环的性能瓶颈:
# 先把目标ID提取成数组(如果id_dataframe是存储ID的Series,直接用这个) target_ids = id_dataframe.values # 一步完成筛选+提取索引,转成列表 index_names_list = full_data[full_data['entity_id'].isin(target_ids)].index.tolist()
为什么这比循环快?
原来的循环是50万次全表扫描(每次full_data['entity_id'] == id都是O(N)操作),时间复杂度是O(M*N)(M=50万,N=200万),这完全是天文数字。而isin()是一次全表扫描+批量匹配,时间复杂度是O(N+M),性能提升至少几十倍甚至上百倍。
极致性能优化:给entity_id建索引
如果你的full_data会频繁根据entity_id做查询,给这个列建立索引能把查找复杂度降到O(logN),进一步提升速度:
# 给entity_id列建立索引(保留原列,避免丢失数据) full_data = full_data.set_index('entity_id', drop=False) # 直接通过索引匹配目标ID,提取原索引并转成列表 index_names_list = full_data.loc[target_ids].index.tolist() # 可选:如果之后需要恢复原索引,执行这一步 full_data = full_data.reset_index(drop=True)
额外注意事项
- 如果
target_ids里有重复值,最终的index_names_list会包含重复的索引。要是需要去重,只需要加.unique():index_names_list = full_data[full_data['entity_id'].isin(target_ids)].index.unique().tolist() - 确保
full_data['entity_id']和target_ids的数据类型一致(比如都是字符串或整数),避免匹配失败。
内容的提问来源于stack exchange,提问作者Kasra
相关产品推荐
相关产品推荐

