转换大熊猫数据帧中的类型



我有一个形状为(350000910(的熊猫数据帧。所有910列都具有类型object和小值,例如1.02.0。我想要float64型。这似乎根本不是一个难题。然而,一旦尝试了等不同的解决方案

df[all_cols] = df[all_cols].astype('float64')   # or 
df[all_cols] = df[all_cols].astype(np.float64)

我发现,甚至不到列总数的10%都需要1个小时。

有什么方法可以让计算速度明显加快吗?

示例代码:

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]
df = pd.DataFrame(np.random.randint(0, 5, size=(300_000, len(all_cols))), columns=all_cols)
  1. 尝试pd.to_numeric
df = df.apply(pd.to_numeric)
#to ignore errors, will return the input:
df = df.apply(pd.to_numeric, errors='ignore')
#to return NaN if invalid parsing (converts all non-digit strings to NaN)
df = df.apply(pd.to_numeric, errors='coerce')
#if you want to convert only some columns (not all columns):
cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=1)
  1. .astype
df = df.astype(float) # or df.astype(np.float64)
  1. 其他方法:
df = pd.DataFrame(df.values.astype(np.float64)) 
#or
df.apply(lambda x: x.astype(np.float64), axis=0)

基准

df = pd.DataFrame({'A':np.random.random(100000).astype(str),'B':np.random.random(100000).astype(str),'C':np.random.random(100000).astype(str),'D':np.random.random(100000).astype(str)})
%timeit df.apply(pd.to_numeric)
# 205 ms ± 54.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df.astype(float)
# 233 ms ± 16.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df = pd.DataFrame(df.values.astype(np.float64))
# 221 ms ± 37 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df.apply(lambda x: x.astype(np.float64), axis=0)
# 219 ms ± 48.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

相关内容

最新更新