是否有更快的方法将pandas数据帧的所有列转换为单一类型?这似乎特别慢:
df = df.apply(lambda x: x.astype(np.float64), axis=1)
我怀疑由于numpy.ndarray.astype
的内存分配开销,我无能为力。
我还试过了pd.to_numeric
,但它却随意选择将我的一些列投射到int
类型中。
答案 0 :(得分:6)
无需apply
,只需直接使用DataFrame.astype
即可。
df.astype(np.float64)
apply
- ing也会给你带来非常糟糕的表现。
示例强>
df = pd.DataFrame(np.arange(10**7).reshape(10**4, 10**3))
%timeit df.astype(np.float64)
1 loop, best of 3: 288 ms per loop
%timeit df.apply(lambda x: x.astype(np.float64), axis=0)
1 loop, best of 3: 748 ms per loop
%timeit df.apply(lambda x: x.astype(np.float64), axis=1)
1 loop, best of 3: 2.95 s per loop
答案 1 :(得分:4)
一种有效的方法是使用数组数据并将其强制转换回数据帧,如此 -
pd.DataFrame(df.values.astype(np.float64))
运行时测试 -
In [144]: df = pd.DataFrame(np.random.randint(11,99,(5000,5000)))
In [145]: %timeit df.astype(np.float64) # @Mitch's soln
10 loops, best of 3: 121 ms per loop
In [146]: %timeit pd.DataFrame(df.values.astype(np.float64))
10 loops, best of 3: 42.5 ms per loop
重新投入数据框并不是那么昂贵 -
In [147]: %timeit df.values.astype(np.float64)
10 loops, best of 3: 42.3 ms per loop # Casting to dataframe costed 0.2ms