Pandas 如何修改列的数据类型

用 astype() 即可修改 pandas 列类型:df['col'].astype(float)。本文覆盖 astype 用法、to_numeric/to_datetime 安全转换、多列批量转换及常见报错处理。

最佳实践
数据整理与查询插画

一句话回答:用 astype() 方法——df['A'] = df['A'].astype(float) 把 A 列转为浮点型。如果列里混有无法转换的值(脏数据),用 pd.to_numeric(df['A'], errors='coerce') 更稳妥,失败值会变成 NaN 而不是报错。

基本用法:astype()

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4.0, 5.0, 6.0]})

df['A'] = df['A'].astype(float)     # int → float
df['B'] = df['B'].astype(int)       # float → int
df['A'] = df['A'].astype(str)       # 转字符串

astype() 接受的目标类型:int、float、str、bool、'datetime64[ns]'、'category' 等,也支持 NumPy dtype(如 'int32'、'float64')以节省内存。

多列批量转换

# 方式一:字典
df = df.astype({'A': float, 'B': 'category'})

# 方式二:循环(示意,A/B/C 须都是可转换的现有列)
for col in ['A', 'B', 'C']:
    df[col] = df[col].astype(float)

脏数据安全转换:to_numeric / to_datetime

astype() 遇到无法解析的值会直接抛 ValueError。真实数据常混有空串、'N/A' 等脏值,此时用专用函数:

# 无法解析的值变成 NaN,而不是报错
df['price'] = pd.to_numeric(df['price'], errors='coerce')

# 日期同理
df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')

本文使用 errors='raise'(报错)或 'coerce'(转为 NaN/NaT)。当前 pandas 3.x 的 to_numeric / to_datetime 不再接受 errors='ignore';astype 的 errors 参数是另一套语义,不能混用。转换前后应统计新增缺失,避免静默吞掉脏数据。

查看与自动推断

df.dtypes                          # 查看每列类型
df.convert_dtypes()                # 自动推断更合适的可空类型(Int64、string 等)
df.infer_objects()                 # 仅对 object 列做保守推断

读文件时也可以一步到位:pd.read_csv(..., dtype={'id': str}, parse_dates=['created_at'])。

常见坑

  • float → int 有 NaN 会报错:只有业务允许时才填 0;可用 astype('Int64')(大写 I)保留缺失,但非整数小数仍需先明确舍入/截断规则
  • 字符串转换有版本差异:pandas 2.x 的 astype(str) 常把 NaN 转为 'nan';pandas 3.x 新字符串类型保留缺失值。跨版本需要明确可空语义时可用 astype('string')
  • 改的是副本不是原列:df[['A']].astype(float) 不会改变 df,必须赋值回 df['A']

常见问题(FAQ)

Q:astype(int) 报 "cannot convert float NaN to integer" 怎么办?

A:列里有缺失值。要么先 fillna() 填值再转,要么用 pandas 可空类型 astype('Int64'),它支持 NaN。

Q:object 列里混着数字和字符串,怎么统一成数值?

A:pd.to_numeric(df['col'], errors='coerce')——能转的转,不能转的变 NaN,然后按需 fillna() 或过滤。

Q:为什么转换后内存没变小?

A:检查是否真的换了更小的 dtype:astype('int32') 比默认 int64 省一半内存;category 类型对低基数字符串列效果显著。用 df.memory_usage(deep=True) 对比验证。

核查依据

本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。


延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台