【问题标题】:Why does the first operation on a Pandas DataFrame take the longest time?为什么 Pandas DataFrame 的第一次操作耗时最长?
【发布时间】:2020-07-20 14:54:19
【问题描述】:

我一直在对一些 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

【问题讨论】:

  • 无法复制,我也是这样
  • 您尝试过使用新的 Python 内核吗?哪个版本的 Python/Pandas?
  • 我可以使用 Python 3.8 和 pandas==1.0.2 重现此行为。运行%prun df['a'] + df['b'] 两次,第一次调用 1293 次,第二次调用 373 次。看起来 Pandas 在这里做了一些惰性导入。在两个不同的数据帧上运行这两个操作会产生相同的增益。所以这应该是由于一次性操作导致了一些开销(例如导入)。当您说您正在处理一批数据帧时,您应该只看到第一个数据帧的性能下降,而不是每个数据帧。
  • 它实际上发生了多次(每个 DF 发生一次)但是我现在发现了问题所在。这是因为我通过迭代返回 DataFrame 切片的 groupby() 结果来获取 DataFrame 列表,然后将新列分配给切片,从而导致警告: SettingWithCopyWarning: A value is trying to be set on a copy of a slice从数据帧。这没有出现,因为该进程正在由 Web 服务器运行。每次出现此警告时都会导致延迟,我通过创建输入 DataFrame 的副本来解决问题

标签: python pandas performance dataframe


【解决方案1】:

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

SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。

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

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

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多