at和iat是Pandas中专用于单点写入的高效方法:at适用于标签索引的单个标量赋值,iat适用于整数位置的极致性能写入,二者均不支持批量操作且需注意视图、类型兼容性及Copy-on-Write等陷阱。

at 和 iat 是 Pandas 中真正能“单点写入”的方法,比 loc/iloc 快得多,尤其适合循环中反复修改单个值。但它们不能批量赋值,用错场景反而会报错或静默失败。
什么时候该用 at 而不是 loc
at 专为「标签索引 + 单个标量」设计,比如你想按行名、列名直接改一个格子,且确定行/列名存在。它比 loc[row, col] 少一层解析开销,实测快 2–3 倍。
- ✅ 正确:df.
at['2023-01-01', 'price'] = 99.5(索引是日期字符串,列名是 'price') - ❌ 错误:df.
at['2023-01-01', ['price', 'qty']] = [99.5, 10](at不支持多列) - ⚠️ 注意:
at在行/列名不存在时抛KeyError,而loc可能自动扩展 DataFrame
iat 的唯一适用场景:整数位置 + 极致性能
iat 绕过所有标签查找,直接按整数坐标(0-based)读写,是 Pandas 里最快的单点访问方式。但它和 iloc 的区别在于:只接受两个整数,不支持切片、列表或布尔索引。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- ✅ 正确:df.
iat[0, 2] = 42(第 0 行、第 2 列) - ❌ 错误:df.
iat[0, [2, 3]] = [42, 43](第二维必须是单个 int) - ⚠️ 风险:如果 DataFrame 索引被重排过(比如调用过
sort_index()),iat的行列号仍按物理顺序算,和标签无关 —— 容易写错位置
常见陷阱:赋值后没生效?检查这三件事
很多人写了 at/iat 却发现值没变,通常卡在这几个地方:
立即学习“Python免费学习笔记(深入)”;
- 赋值目标是视图(view)而非原 DataFrame:确保 df 没被链式索引截断,比如
df[df.flag].at[...]是无效的 - 数据类型不兼容:比如对
int64列用at赋float,Pandas 默认不自动升格,会静默转成nan(开启pd.options.mode.chained_assignment = 'warn'可捕获) - 用了 copy-on-write 模式(Pandas 2.0+ 默认):某些操作会触发拷贝,
at修改的是副本。加一句df = df.copy()或显式禁用(pd.options.mode.copy_on_write = False)可绕过
真正需要单点修改时,at 和 iat 是无可替代的;但它们像手术刀——精准,也容易划伤自己。别试图用它们做批量操作,也别在不确定索引结构时硬套 iat。

















