自动优化Pandas数据类型:解决CSV读写后dtype膨胀问题
解决Pandas读取CSV后数据类型膨胀、内存占用过高的问题
这个问题太常见了——CSV是纯文本格式,不保留任何数据类型信息,所以pd.read_csv()默认会用最通用的数值类型(比如int64、float64)来避免数据丢失,这就导致了内存占用暴涨。针对你的需求,我们可以通过自动向下转型数值列的方式,把每一列转成最小可行的数据类型,下面是具体的解决方案:
方法1:自定义函数自动向下转型所有数值列
我们可以写一个通用函数,遍历DataFrame的数值列,利用pd.to_numeric()的downcast参数自动将列转换为最小的兼容类型:
import pandas as pd def optimize_dtypes(df): # 处理整数列:自动转成最小的整数类型(int8/int16/int32等) int_columns = df.select_dtypes(include=["int64"]).columns df[int_columns] = df[int_columns].apply( pd.to_numeric, downcast="integer" ) # 处理浮点列:自动转成最小的浮点类型(float32/float16等) float_columns = df.select_dtypes(include=["float64"]).columns df[float_columns] = df[float_columns].apply( pd.to_numeric, downcast="float" ) # 额外优化:将仅含0/1的整数列转成bool类型(进一步节省内存) bool_candidates = df.select_dtypes(include=["int64", "int32"]).columns for col in bool_candidates: unique_vals = df[col].unique() if len(unique_vals) == 2 and set(unique_vals).issubset({0, 1}): df[col] = df[col].astype("bool") return df
验证你的示例
用你的测试代码验证:
# 写入CSV d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(d) df.col1 = df.col1.astype('int8') df.to_csv('test.csv', index=False) # 读取并优化 df_read = pd.read_csv('test.csv') df_optimized = optimize_dtypes(df_read) df_optimized.info()
此时col1会自动转回int8类型,内存占用回到和原DataFrame一致的水平。
方法2:针对大型数据集的分块处理
如果你的数据集大到无法一次性加载到内存,可以结合chunksize参数分块读取、优化,再合并结果:
chunk_size = 10_000 chunks = [] for chunk in pd.read_csv('large_data.csv', chunksize=chunk_size): optimized_chunk = optimize_dtypes(chunk) chunks.append(optimized_chunk) df_optimized = pd.concat(chunks, ignore_index=True)
为什么infer_dtypes没达到预期?
df.infer_dtypes()只是推断列应该是什么类型(比如告诉你某列是整数类型),但它不会主动修改列的dtype,也不会做向下转型。而上面的函数是直接执行类型转换,并且自动选择最小的兼容类型,这才是解决内存问题的关键。
内容的提问来源于stack exchange,提问作者EmreAydin
相关产品推荐
相关产品推荐

