编写高性能数据处理代码 - Fast Dtype Conversion

65 阅读3分钟

各位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() 等)时,将数据转换为占用内存更小的数据类型,从而提升内存效率。

常见用法及作用

  1. 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)
  1. astype() 中使用(通过辅助函数实现)

astype() 本身不直接支持 downcast,但你可以结合 pd.to_numeric() 使用:


df['col'] = pd.to_numeric(df['col'], downcast='float')

  1. 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)可能会影响计算结果,应谨慎使用。