择洗篇-Day11|调味转化:astype 类型转换,规范化数据

0 次阅读 2026-10-21 15:04

📖 知识点

1. 为什么要做类型转换?

数据类型决定能做什么操作:

  • 数字列才能加减、算均值
  • 日期列才能按时间排序、分析
  • 文本列不能直接算数

如果 "价格" 读成了文本(object),df["价格"].sum() 会出错或乱算。用 astype 把它转成数字,数据才 "入味可用"。

💡 生活比喻 糖该是甜的、盐该是咸的。astype 就是把误放的糖换成盐、把整包调料归位 —— 让每样数据回到它该有的 "属性"。

2. astype () 基本用法

# 把"价格"列转成整数
df["价格"] = df["价格"].astype(int)

# 把"销量"列转成浮点数
df["销量"] = df["销量"].astype(float)

# 把"日期"列转成字符串
df["日期"] = df["日期"].astype(str)

3. 常用类型

类型说明例子
int整数astype(int)
float小数astype(float)
str文本astype(str)
bool布尔astype(bool)

4. 查看转换效果

转换后用 dtypes 验证:

df["价格"] = df["价格"].astype(int)
print(df.dtypes)   # 价格变为 int64

⚠️ 易错提醒

  1. astype 返回新列,要赋值回原列或原表才生效(df["列"] = df["列"].astype(int))
  2. 列里若有无法转的文本(如 "5 元"),转 int 会报错,需先清洗(Day12)
  3. 转换前先用 dtypes 看清当前类型,判断需不需要转

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份 "含文本数字" 的数据(价格是字符串、数量是字符串)
  2. 先用 dtypes 查看当前类型(应为 object 文本)
  3. 用 astype 把 "价格" 转成 int、"数量" 转成 float
  4. 再次查看 dtypes,确认类型已转换
  5. 用转换后的数字列做一次求和,验证可正常计算

参考代码

import pandas as pd

# 数据里价格、数量是"文本数字"(object类型)
data = {
    "菜名": ["白菜", "番茄", "土豆"],
    "价格": ["3", "5", "2"],       # 字符串数字
    "数量": ["10", "20", "30"],    # 字符串数字
}
df = pd.DataFrame(data)

print("===== 转换前类型 =====")
print(df.dtypes)

# 调味转化:把文本数字转成真正的数字
df["价格"] = df["价格"].astype(int)
df["数量"] = df["数量"].astype(float)

print("\n===== 转换后类型 =====")
print(df.dtypes)

print("\n===== 验证可计算 =====")
print("总价合计:", df["价格"].sum())
print("数量合计:", df["数量"].sum())

运行输出:

===== 转换前类型 =====
菜名    object
价格    object
数量    object
dtype: object

===== 转换后类型 =====
菜名     object
价格      int64
数量    float64
dtype: object

===== 验证可计算 ====="
总价合计: 10
数量合计: 60.0

💡 观察:转换前价格 / 数量是 object(文本),无法算数;astype 转成 int/float 后,.sum() 正常求和。这就是 "调味" 的威力。

🧠 思考题

  1. 如果 "价格" 列是 "5元" 这样的文本,直接 astype(int) 会怎样?应该先做什么?
  2. 为什么说 "类型决定能做什么操作"?举一个数字列是文本导致出错的例子。