lookup 已被 pandas 2.0+ 彻底移除,因隐式索引易出错;推荐用 .loc(标签索引)、.iloc(位置索引)或 df.values[i,j](整数坐标)替代,优先选择语义清晰、健壮性强的 .loc。

lookup 不是 Python 原生或 pandas 内置的方法,直接调用会报 AttributeError: 'DataFrame' object has no attribute 'lookup' —— 这是新手最常卡住的第一步。
从 pandas 1.2.0 开始,lookup 已被正式弃用(deprecated),并在 2.0+ 版本中彻底移除。你现在没法“用它”,得换等效但更明确、更安全的方式。
为什么 lookup 被删掉?
它隐式依赖行列索引顺序,不检查坐标合法性,容易返回错位值;且不支持 MultiIndex、缺失坐标时静默失败,调试困难。pandas 官方推荐显式索引操作。
pandas 中替代 lookup 的三种可靠写法
根据你的使用场景选一种:
- 要按「行标签 + 列标签」取单个或多个点(如
df.loc[row_label, col_label])→ 用.loc - 要批量按行/列数组取值(如 100 行 × 5 列的坐标对)→ 用
.iloc配合整数位置索引 - 要类似旧
lookup(row_labels, col_labels)批量取值 → 用df.values[row_indices, col_indices](最接近原行为,但要求输入是整数位置)
示例:
假设 df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], index=['a','b','c'], columns=['x','y','z'])
想取 ('b','y') 和 ('c','x') 两个点:
# ✅ 推荐:用 .loc(语义清晰,支持标签) df.loc[['b','c'], ['y','x']].values.diagonal() # [5, 7] <h1>✅ 更通用:转整数位置后用 .values 索引(最快,但需确保标签存在)</h1><p>row_pos = df.index.get_indexer(['b','c']) col_pos = df.columns.get_indexer(['y','x']) df.values[row_pos, col_pos] # array([5, 7])</p><h1>❌ 不要用:df.lookup(['b','c'], ['y','x']) → AttributeError</h1>
注意 DataFrame.index/columns 类型对取值的影响
如果行或列是 pd.CategoricalIndex 或含重复标签,.loc 可能返回多行/多列,而 .values 索引会出错(IndexError)。务必先确认:
- 用
df.index.is_unique和df.columns.is_unique检查唯一性 - 用
df.index.get_loc('label')替代手动找下标,避免KeyError - 若列名含空格或特殊字符,
.loc仍可用,但df.label_name会失效
性能差异其实很小,别为“快”选错方式
在万级数据下,.values[i,j] 比 .loc 快约 10–20%,但可读性和健壮性差很多。真正影响速度的是:
- 是否提前把 label 转成整数位置(避免重复
get_indexer) - 是否用了
.copy()或链式赋值触发隐式拷贝 - 是否在循环里反复调用
.loc(应向量化)
旧代码里残留的 lookup 调用,必须改掉——不是语法问题,而是逻辑风险。最稳妥的迁移路径是:先用 df.index.get_indexer + df.values 对齐位置,再批量取;日常开发直接用 .loc,它足够快,也足够安全。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











