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) 对比验证。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。