使用pandas的DataFrame.at创建新列时是否可提前指定列数据类型?
问题原因说明
你遇到的类型变化不是随机的,是pandas的自动类型推断逻辑导致的:当你通过df.at[index, '不存在的列名']赋值时,pandas会先自动创建新列,此时如果存在未赋值的行(默认填充NaN,而NaN本身是float类型),pandas会做向上类型兼容,比如整数值加NaN就变成float,字符串加NaN就变成object类型。
正确解决方案
完全可以在赋值前就固定新列类型,不需要事后转astype,操作方法如下:
- 第一步先给DataFrame初始化指定类型的空列,直接调用
pd.Series指定dtype即可:
# 示例:要新增可空字符串类型的列 df['new_column'] = pd.Series(dtype='string') # 如果要存普通字符串(兼容None)就用dtype=object # 要存可空整数就用dtype='Int64'(注意首字母大写,是pandas专属可空类型) # 要存时间类型就用dtype='datetime64[ns]'
- 第二步再用
df.at[index, 'new_column']做逐行赋值,此时列的类型已经固定,不会再被自动转换。
补充说明
如果已经通过df.at创建了类型错误的列,也可以用df['new_column'] = df['new_column'].astype('目标类型')做修正,但提前初始化的方式更稳妥,能避免隐式类型转换带来的脏数据问题。
内容的提问来源于stack exchange,提问作者paolov
相关产品推荐
相关产品推荐

