首页 > 解决方案 > 为什么 Pandas DataFrame 的第一次操作耗时最长?

问题描述

我一直在对一些 Pandas DataFrame 操作进行分析,并注意到第一个操作需要更长的时间,其中涉及某种静态开销。

例如在笔记本中:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': np.random.randn(1000), 'b': np.random.randn(1000)})

%%time
df['sum'] = df['a'] + df['b']

挂墙时间:14 毫秒


%%time
df['sum2'] = df['a'] + df['b']

挂墙时间:1 毫秒


我执行了 %prun 并看到第一个操作正在调用 nt.stat、winreg.OpenKey,就像它出于某种原因正在执行一些文件系统操作一样。我也注意到 Linux 机器上的类似行为。

原因是什么,是否可以解决?它确实减慢了我正在做的一些处理,涉及对一组小型 DataFrames 执行一批操作,并且第一次操作的开销比所有其他操作的总和要长……任何帮助将不胜感激!

使用 Python 3.5.3 和 Pandas 0.25.3

标签: pythonpandasperformancedataframe

解决方案


这个问题在一个会话中多次发生(不仅仅是一次导入),但我已经找到了原因。这是因为我通过迭代返回 DataFrame 切片的 groupby() 结果来获取 DataFrame 列表,然后将新列分配给切片,从而导致警告:

SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值。

这没有出现,因为该进程正在由 Web 服务器运行。每次出现此警告时,都会导致我注意到的延迟。

通过在应用操作之前创建输入 DataFrame 的副本来修复问题


推荐阅读