我遇到了一些遗留代码,其中数据存储为单行pd.DataFrame
。
我的直觉是,在这种情况下,使用 pd.Series
会更快 - 我不知道他们如何进行优化,但我知道他们可以并且这样做。
我的直觉正确吗?还是大多数操作没有显着差异?
(澄清一下 - 显然最佳实践不是单行数据帧,但我问的是性能(
是的,
对于大量列,会对性能产生明显影响。您应该考虑到DataFrame
是Series
字典,因此当您对单行执行操作时,pandas
必须先合并所有列值,然后再执行该操作。
即使对于 100 个元素,您也可以看到有一个命中:
s = pd.Series(np.random.randn(100))
df = pd.DataFrame(np.random.randn(1,100))
%timeit s.sum()
%timeit df.sum(axis=1)
104 µs ± 5.08 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
194 µs ± 2.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
在我看来,没有理由使用索引值与该df
的列名相同的Series
无法实现的单行 df
性能下降不是线性的,因为对于 10k 阵列,它不会差 2 倍:
s = pd.Series(np.random.randn(10000))
df = pd.DataFrame(np.random.randn(1,10000))
%timeit s.sum()
%timeit df.sum(axis=1)
149 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
253 µs ± 36.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)