Python pandas数据类型转换astype详解
用astype把DataFrame列在int、float、str、category之间转换,配合pd.to_numeric、pd.to_datetime处理脏数据类型,避免入库和计算报错。
场景痛点
读进来的Excel,金额列全是object类型(因为混了文字"无"),ID列被识别成float(因为有空值),一聚合就报错或者结果不对。astype转类型前必须先清洗脏数据,不然抛ValueError,这篇把完整套路讲清楚。
用到的库
pip install pandas
完整代码
import pandas as pd
def type_demo():
df = pd.DataFrame({
"order_id": ["1001", "1002", "1003"],
"amount": ["1000", "2000", "3000"], # 字符串形式的数字
"qty": [1, 2, 3],
"flag": ["yes", "no", "yes"],
})
print("转换前:")
print(df.dtypes)
# 1. 整数转字符串(订单号当文本,不要做数值计算)
df["order_id"] = df["order_id"].astype(str)
# 2. 字符串转数值:先to_numeric兜底,再astype
df["amount"] = pd.to_numeric(df["amount"], errors="coerce").astype(float)
# 3. int转float(有NaN时必须是float,否则报错)
df["qty"] = df["qty"].astype(float)
# 4. 字符串转类别型,节省内存
df["flag"] = df["flag"].astype("category")
print("\n转换后:")
print(df.dtypes)
print(df)
# 5. 常见报错演示:含脏数据直接astype会失败
bad = pd.Series(["100", "200", "无"])
try:
bad.astype(int)
except ValueError as e:
print("\n直接astype报错:", e)
print("正确做法:先pd.to_numeric(errors='coerce')")
if __name__ == "__main__":
type_demo()
代码讲解
df["col"].astype(str)把数字列转成字符串,订单号、手机号这种不要做算术运算的列就该用str。pd.to_numeric(series, errors="coerce")把不能转的变成NaN,比直接astype稳,是办公场景的首选。- 整数列里有NaN时,pandas要求该列必须是float(因为整数不能存NaN),所以astype(float)是必须的。
astype("category")把低基数字符串列转成类别类型,几万行的部门、状态列能省大量内存。- 多列批量转换用
df = df.astype({"col1": int, "col2": str, "col3": float})字典一次搞定。
运行结果
控制台打印转换前后的dtypes对比:order_id变object,amount变float64,qty变float64,flag变category。最后演示直接astype含脏数据的Series会抛ValueError,并给出正确做法。
注意事项
- astype(int)不会自动四舍五入,带小数的字符串先
pd.to_numeric().round().astype(int)。 - 把float转int前先确认没有NaN,否则
int(float("nan"))会报错或得到奇怪结果。 - 日期列不要用astype(datetime),用
pd.to_datetime(),容错性好得多。 - 存入SQLite前,datetime列保留为pandas Timestamp即可,to_sql会自动处理。

更新时间:2026-09-14 20:58:00