各位python开发者/爱好者,我是 Pythonista,爱写优雅的python代码!
在AI飞速发展的今天数据科学占据了极高的地位,编写高效的 Python 代码成为一项重要的技能。
作为数据科学家,我们经常处理复杂的工作流程,在 Pandas 和 NumPy 等库之间切换以进行数据整理,使用 SQL 进行查询,以及使用 regex 进行数据清理和特征提取。
以上四种工具都是常用的,因此,了解更多关于它们的信息总是有用的。
在本文中介绍快速的数据类型转换(Fast Dtype Conversion)中的downcast,这肯定能提升您在 Pandas方面的技能。
"Talk is cheap. Show the code",开干!
# 一次性地向下转换所有浮点数和整数
for col in df.select_dtypes(include=['float','int']):
df[col] = pd.to_numeric(df[col], downcast=('integer' if df[col].dtype.kind=='i' else 'float'))
工作原理:
- 向下转换选择最合适的最小子类型,从而减少宽表上的内存使用。pandas 中的 downcast 是一种类型转换优化参数,主要用于在执行类型转换(如 astype()、to_numeric()、convert_dtypes()、infer_objects() 等)时,将数据转换为占用内存更小的数据类型,从而提升内存效率。
在处理超宽表(thousands of columns)的大型数据集时,Pandas 的默认数据类型推断可能会非常慢或占用大量内存。为此,Pandas 提供了一些快速的数据类型转换(Fast Dtype Conversion)策略,这里介绍 downcast帮助你加速读取和转换过程。
pandas 中的 downcast 是一种类型转换优化参数,主要用于在执行类型转换(如 astype()、to_numeric()、convert_dtypes()、infer_objects() 等)时,将数据转换为占用内存更小的数据类型,从而提升内存效率。
✅ 常见用法及作用
- pd.to_numeric() 中的 downcast
将字符串或其他类型转换为数值类型时,downcast 可以进一步压缩为更小的数据类型:
import pandas as pd
s = pd.Series([1, 2, 3])
# 默认转换为 int64
pd.to_numeric(s) # dtype: int64
# downcast 为最小的整型,如 int8
pd.to_numeric(s, downcast='integer') # dtype: int8
参数选项:
- 'integer': 转换为较小的整数类型,如 int8, int16, int32
- 'signed': 同 'integer',但仅用于有符号整数
- 'unsigned': 转换为较小的无符号整数类型,如 uint8, uint16
- 'float': 转换为 float32(而不是默认的 float64)
- astype() 中使用(通过辅助函数实现)
astype() 本身不直接支持 downcast,但你可以结合 pd.to_numeric() 使用:
df['col'] = pd.to_numeric(df['col'], downcast='float')
- convert_dtypes() 中的 downcast
用于 DataFrame 的类型优化,虽然该函数更偏向将对象类型转换为 Pandas 扩展类型(如 Int64、string),但也可以结合 infer_objects() 和 to_numeric() 进一步精简类型。
📦 使用场景举例
df = pd.DataFrame({
'a': [1, 2, 3], # int64
'b': [1.0, 2.0, 3.0], # float64
})
df['a'] = pd.to_numeric(df['a'], downcast='integer') # int8
df['b'] = pd.to_numeric(df['b'], downcast='float') # float32
⚠️ 注意事项
- downcast 只会向更小但兼容的类型转换,不会改变数值精度(除非 float 精度不足)。
- 如果数据不能安全转换(比如有超出范围的值),则不会 downcast。
- 有时候精度问题(如 float64 转 float32)可能会影响计算结果,应谨慎使用。