访问带MultiIndex的pandas DataFrame单元格为何丢失类型信息?
这是旧版本pandas存在的已知bug,不是你的使用方式有问题。
具体原因
用loc对带MultiIndex的DataFrame取单个标量时,旧版本pandas的内部逻辑会先把匹配到的整行提取为临时Series:只要该行存在浮点类型的列(你示例里的a列是float64),就会触发整行的类型向上提升,把原本是int64的b列也强制转成float64,最后返回的就是2.0。
单索引场景的loc走了更短的优化路径,不会触发整行类型转换,所以能保留原始的int64类型。
at不会出问题的原因很简单:它就是专门给单个单元格存取做的API,内部不会拉取整行做处理,直接根据行列定位读取原始存储的值,所以不管是单索引还是MultiIndex都能返回正确类型。
解决方法
- 单个单元格读写优先用
at,不仅类型不会错,性能也比loc高很多 - 如果必须用
loc,取值后可以显式转类型,比如df2.loc[(3,4),"b"].astype("int64"),或者调用.item()拿到Python原生的int值 - 把pandas升级到1.4.0及以上版本,这个问题在后续版本已经被修复了
内容的提问来源于stack exchange,提问作者sds
相关产品推荐
相关产品推荐

