【发布时间】:2020-09-14 13:22:21
【问题描述】:
为什么pandas.DataFrames 上的操作这么慢?!请看以下示例。
测量:
- 创建一个填充了随机浮点数的
numpy.ndarray - 创建一个
pandas.DataFrame填充相同的 numpy 数组
我测量以下操作的时间
-
对于
numpy.ndarray- 沿 0 轴取和
- 沿 1 轴求和
-
对于
pandas.DataFrame- 沿 0 轴取和
- 沿 1 轴求和
-
对于
pandas.DataFrame.values -> np.ndarray- 沿 0 轴取和
- 沿 1 轴求和
观察
- 总结
numpy.ndarrays' is much faster then operating onpandas.DataFrames`。 - 如果
pd.DataFrame不只包含浮点数并且没有附加任何特殊内容(MultiIndex 或其他),这甚至是正确的。 -
numpy.ndarray上的操作大约快 7 到 10 倍。
问题
- 为什么会这样?
- 如何优化?
-
pandas是否无法调用或通过numpys 的操作?
import numpy as np
import pandas as pd
n = 50000
m = 5000
array = np.random.uniform(0, 1, (n, m))
dataframe = pd.DataFrame(array)
麻木
%%timeit
array.sum(axis=0)
206 ms ± 3.78 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
array.sum(axis=1)
233 ms ± 33.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
熊猫
%%timeit
dataframe.sum(axis=0)
1.65 s ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
dataframe.sum(axis=1)
1.74 s ± 15.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
没有熊猫的熊猫
让我们单独对值进行操作...
%%timeit
dataframe.values.sum(axis=0)
206 ms ± 7.13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
dataframe.values.sum(axis=1)
181 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
【问题讨论】:
-
Sofia Heisler from pycon2017 states 和 Pandas 一样,NumPy 对数组对象(简称 ndarrays)进行操作;但是,它省去了 Pandas 系列操作所产生的大量开销,例如索引、数据类型检查等。因此,NumPy 数组的操作可以比 Pandas 系列的操作快得多。跨度>
-
@Sofia:谢谢您的回答,但如果数据框如此简单,为什么要这样做?它没有混合数据类型。我希望,在这种情况下,我只会得到一些开销,这些开销会随着更大的矩阵而缩小。
标签: python pandas numpy dataframe