将所有数据框列转换为浮动的最快方法 - pandas astype 慢

Posted

技术标签:

【中文标题】将所有数据框列转换为浮动的最快方法 - pandas astype 慢【英文标题】:Fastest way to cast all dataframe columns to float - pandas astype slow 【发布时间】:2017-07-26 11:55:51 【问题描述】:

有没有更快的方法将 pandas 数据框的所有列转换为单一类型?这似乎特别慢:

df = df.apply(lambda x: x.astype(np.float64), axis=1)

由于numpy.ndarray.astype 的内存分配开销,我怀疑我无能为力。

我也尝试过pd.to_numeric,但它任意选择将我的一些列转换为int 类型。

【问题讨论】:

【参考方案1】:

不需要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

【讨论】:

【参考方案2】:

一种有效的方法是使用数组数据并将其转换回数据帧,就像这样 -

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

【讨论】:

速度更快,但会破坏列名。当设置列名时,它需要与df.astype(np.float64) 相似的时间。 +1 对于我的应用程序,我不需要所有列名,所以我部分设置了我需要的列名,这带来了巨大的性能提升!

以上是关于将所有数据框列转换为浮动的最快方法 - pandas astype 慢的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pandas 数据框列转换为本机 python 数据类型?

将 pandas 数据框列标签从浮点数转换为整数

将 pandas 数据框列从十六进制字符串转换为 int

python pandas数据框列转换为dict键和值

将多个火花数据框列转换为具有列表类型的单列

将 pandas 数据框列导入为字符串而不是 int