大型Pandas DataFrame列类型快速转换为float64的方法
快速将大尺寸Object类型DataFrame转换为float64的方法
问题背景
存在形状为(350000, 910)的Pandas DataFrame,所有910列均为object类型,存储内容为1.0、2.0这类小数值。使用常规的astype('float64')或astype(np.float64)转换时速度极慢,处理不到10%的列就耗时1小时,需要高效的转换方案。
优化方案
方案1:用pd.to_numeric批量处理
pd.to_numeric在字符串转数值场景下比astype更高效,结合apply批量处理所有列:
df[all_cols] = df[all_cols].apply(pd.to_numeric, downcast='float')
- 说明:
downcast='float'会自动选择更紧凑的浮点类型(如float32),若必须使用float64可移除该参数;紧凑类型能减少内存占用,间接提升转换速度。
方案2:转Numpy数组后重构DataFrame
利用Numpy底层C实现的批量转换能力,绕过Pandas逐列处理的开销:
# 将DataFrame转为numpy数组并转换类型 arr = df[all_cols].values.astype(np.float64) # 用转换后的数组重构DataFrame df[all_cols] = pd.DataFrame(arr, columns=all_cols, index=df.index)
- 说明:这种方式的转换速度通常是常规
astype的5-10倍以上,尤其适合超大尺寸数据集。
方案3:给astype加copy=False参数减少内存开销
若坚持使用astype,可通过copy=False避免额外内存复制,提升速度:
df[all_cols] = df[all_cols].astype('float64', copy=False)
- 说明:该参数会尝试在原数据内存区域直接修改类型(若内存布局允许),减少内存占用和复制耗时。
测试验证
用提供的示例代码模拟场景测试(需先将数据转为object类型模拟真实情况):
import string import pandas as pd import numpy as np all_cols = [letter + str(x) for x in range(1, 36) for letter in string.ascii_uppercase] # 生成测试数据并转为object类型 df = pd.DataFrame(np.random.randint(0, 5, size=(300_000, len(all_cols))), columns=all_cols).astype(str) # 测试方案2的速度 %timeit arr = df.values.astype(np.float64); df_new = pd.DataFrame(arr, columns=all_cols, index=df.index)
内容的提问来源于stack exchange,提问作者PeeteKeesel
相关产品推荐
相关产品推荐

