Int64类型DataFrame调用to_numpy无法修改原数据,如何向量化修改指定位置值?
问题原因
两种int类型的底层存储逻辑不同导致了修改效果的差异:
- 原生
int64是numpy原生类型,DataFrame底层直接存储连续的numpy数组,to_numpy()默认返回视图,修改返回值会同步到原DataFrame - 可空类型
pd.Int64Dtype是pandas自定义的扩展数组类型,底层用「值数组+掩码数组」的结构存储,to_numpy()必须做类型转换生成新数组,返回的永远是拷贝,修改自然不会影响原DataFrame
向量化修改方案
直接用pandas原生的iloc索引即可,不需要循环也不需要转numpy数组:
two.iloc[r, c] = 99
该操作本身是向量化实现的,性能远高于for循环,同时兼容所有pandas支持的数据类型(包括各类扩展类型)。
效果验证
执行赋值后打印two即可看到对应位置已被修改:
print(two)
输出:
0 1 2 3 4 0 0 99 2 3 4 1 5 6 7 8 99 2 10 11 12 13 14 3 15 99 17 18 19 4 99 99 22 23 24
补充说明
你使用的pandas 1.3.1版本完全兼容上述索引语法,不需要额外适配。如果需要修改的值和原类型不匹配,pandas会自动做安全类型转换,不会出现隐式类型降级的问题。
内容的提问来源于stack exchange,提问作者Ch3steR
相关产品推荐
相关产品推荐

