我的知识记录

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会自动处理。

Python pandas数据类型转换astype详解

标签:

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

上一篇:Python pandas数据清洗去重去空实战

下一篇:Python pandas apply自定义函数教程