如何向pd.DataFrame添加单元格时保留np.uint64类型,为何转为float64
类型转换原因说明
你遇到的类型变化是pandas的两个底层机制共同导致的:
- 新增行时自动填充缺失值
当你执行df.at[2, 'a'] = x时,索引值2在原DataFrame的RangeIndex中不存在,pandas会自动新增索引为2的行。此时你只给a列赋值,未赋值的b列在该行的位置会被自动填充为NaN(Not a Number,缺失值标记)。 - 原生numpy整数类型不支持存储NaN
np.uint64属于numpy原生的无符号整数类型,这类类型的底层存储结构没有预留缺失值的标记位,无法兼容NaN。当列中出现NaN时,pandas会自动将整列的类型向上转型为可以同时容纳原整数数值和NaN的类型,默认就是np.float64。这也是为什么你新增一行后,a、b两列的类型都变成了float64。
如果需要避免类型转换,可以将列的类型声明为pandas专属的可空无符号整数类型pd.UInt64Dtype(),该类型原生支持缺失值存储,新增行时不会触发类型上浮:
# 修改类型声明代码即可 df = df.astype({'a': pd.UInt64Dtype(), 'b': pd.UInt64Dtype()})
内容的提问来源于stack exchange,提问作者rafa
相关产品推荐
相关产品推荐

