pin_drop当前位置:知识文库 ❯ 图文

Pandas数据类型转换详解 - astype to_numeric教程

Pandas DataFrame数据类型转换完整教程

一、数据类型转换概述

在数据处理过程中,经常需要将数据从一种类型转换为另一种类型。例如,将从文件读取的字符串类型数字转换为数值类型,或将日期字符串转换为datetime对象。pandas提供了astype()to_numeric()等方法来实现类型转换。

pandas支持的主要数据类型包括:int64、float64、object(字符串)、datetime64、bool、category等。正确的数据类型不仅能节省内存,还能确保运算结果的正确性。


二、语法详解

代码示例

# 单列类型转换
df['column'] = df['column'].astype('int64')

# 多列类型转换
df = df.astype({'col1': 'float64', 'col2': 'str'})

# 安全转换(处理无法转换的值)
pd.to_numeric(df['column'], errors='coerce')

# 日期类型转换
pd.to_datetime(df['column'], format='%Y-%m-%d')

# 分类类型转换
df['column'] = df['column'].astype('category')

三、参数说明

方法 参数 说明
astype() dtype 目标数据类型,如'int64'/'float64'/'str'/'category'
copy 是否返回副本,默认True
errors 'raise'=报错(默认),'ignore'=忽略错误
to_numeric() errors 'raise'/'coerce'(转为NaN)/'ignore'
downcast 'integer'/'signed'/'unsigned'/'float',压缩数据类型节省内存
Series方法,不能直接用于DataFrame

四、返回值

astype()返回类型转换后的新Series或DataFrame;to_numeric()返回转换后的Series;to_datetime()返回datetime类型的Series。转换失败时会抛出ValueError异常(除非设置了errors='ignore'或errors='coerce')。


五、代码示例

示例1:基本用法

代码示例

import pandas as pd

# 创建示例数据
df = pd.DataFrame({
    '产品': ['A', 'B', 'C', 'D'],
    '价格': ['12.5', '25.0', '8.9', '30.0'],
    '销量': ['100', '200', '150', '80'],
    '日期': ['2024-01-01', '2024-02-01', '2024-03-01', '2024-04-01']
})

# 查看原始数据类型
print(df.dtypes)

# 字符串转数值
df['价格'] = df['价格'].astype('float64')
df['销量'] = df['销量'].astype('int64')

# 批量转换
df = df.astype({'价格': 'float64', '销量': 'int64'})

# 转换为分类类型(适合低基数字符串列)
df['产品'] = df['产品'].astype('category')
print(df.dtypes)

示例2:进阶用法

代码示例

import numpy as np

# 处理包含非数字字符的情况
data = pd.DataFrame({
    '收入': ['1000', '2000', 'N/A', '3000', ''],
    '年龄': ['25', '30', 'invalid', '35', '28']
})

# to_numeric 安全转换(无法转换的转为NaN)
data['收入'] = pd.to_numeric(data['收入'], errors='coerce')
data['年龄'] = pd.to_numeric(data['年龄'], errors='coerce')

# downcast 节省内存
data['收入'] = pd.to_numeric(data['收入'], downcast='float')
print(data['收入'].dtype)  # float32

# 日期转换
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d')

# 自定义格式日期转换
df2 = pd.DataFrame({'日期': ['01/15/2024', '02/20/2024']})
df2['日期'] = pd.to_datetime(df2['日期'], format='%m/%d/%Y')

示例3:实际应用

代码示例

# 模拟从CSV读取的原始数据(全部为object类型)
raw_data = pd.DataFrame({
    '订单号': ['001', '002', '003', '004', '005'],
    '下单时间': ['2024/01/15 10:30', '2024/01/15 14:20', '2024/01/16 09:00', '2024/01/16 16:45', '2024/01/17 11:00'],
    '商品金额': ['99.9', '259.0', '45.5', '1299.0', '89.0'],
    '优惠金额': ['10', '50', '0', '200', ''],
    '是否会员': ['是', '否', '是', '否', '是'],
    '评分': ['4.5', '3.0', 'N/A', '5.0', '4.0']
})

# 数据类型转换处理
df = raw_data.copy()
df['下单时间'] = pd.to_datetime(df['下单时间'], format='%Y/%m/%d %H:%M')
df['商品金额'] = pd.to_numeric(df['商品金额'], errors='coerce')
df['优惠金额'] = pd.to_numeric(df['优惠金额'], errors='coerce').fillna(0).astype('float32')
df['是否会员'] = df['是否会员'].map({'是': True, '否': False}).astype('bool')
df['评分'] = pd.to_numeric(df['评分'], errors='coerce')

print(df.dtypes)
print(df.head())

六、实际应用场景

  • 数据导入预处理:从CSV/Excel读取数据后,将字符串类型的数值和日期转换为正确类型

  • 内存优化:将int64降级为int32/int16,将重复字符串转为category类型,大幅减少内存占用

  • 机器学习预处理:将类别变量转为category编码,将布尔字段转为int类型供模型使用

小贴士

使用df.memory_usage(deep=True)可以查看各列内存占用。将大基数的object列转为category类型通常可以节省50%以上的内存。对于超大整数ID列,可以使用字符串类型存储避免精度丢失。


七、注意事项

注意1:浮点数转整数时会截断小数部分而非四舍五入,需要先处理精度或使用round()方法。

注意2:包含NaN的列无法直接转为int类型,pandas 1.0+可以使用'Int64'(大写I)可空整数类型。

提示:转换前使用df.dtypes查看当前类型,转换后用df.info()确认结果。


八、小结

  • astype()是最通用的类型转换方法,支持单列和批量转换

  • to_numeric()to_datetime()提供更安全的转换选项

  • 合理使用category类型和下采可以有效减少内存占用


九、练习题

练习1

创建一个包含混合类型数据的DataFrame,将所有字符串数字转为数值类型,字符串日期转为datetime类型,并验证转换结果。

练习2

编写一个函数,自动检测DataFrame中各列的类型,将可以压缩的数值类型进行downcast,将重复率超过50%的字符串列转为category,并输出内存优化前后的对比。

练习3

对比astype()直接转换和to_numeric(errors='coerce')处理脏数据的差异,分析各自的适用场景。

常见问题

为什么有些列显示object类型但实际上是字符串?

在pandas中,字符串类型统一用object表示。pandas没有原生的string类型(直到1.0+版本才引入StringDtype)。object类型可以包含任意Python对象,不一定是字符串。

如何将包含NaN的列转为整数类型?

使用pandas的可空整数类型:df['col'].astype('Int64')(注意大写I)。或者先填充NaN再转为普通int类型。

category类型有什么优缺点?

优点:节省内存、加速groupby操作、支持有序类别。缺点:新增类别需要重新设置、某些操作不支持、不适合高基数列。

to_datetime的format参数有什么作用?

format参数指定日期字符串的格式模板,如'%Y-%m-%d'。指定format可以大幅提升转换速度,避免pandas自动推断格式的开销。如果格式不匹配会抛出异常。

标签: pandas 数据类型 astype 类型转换 to_numeric Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pandas缺失值处理方法大全 - dropna fillna实战教程 下一篇: Pandas字符串操作str完整教程 - 正则提取实战

poll相关推荐