如何在jupyter笔记本中使用tqdm结合pandas?

43
我正在使用jupyter笔记本中的pandas进行一些分析,由于我的应用函数需要很长时间,因此我想看到一个进度条。通过这篇文章here,我发现了tqdm库,它为pandas操作提供了一个简单的进度条。还有一个Jupyter集成,它提供了一个非常好的进度条,进度条本身会随着时间的推移而变化。

然而,我想将两者结合起来,但不太清楚如何实现。让我们只取文档中的同一个例子。

import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))

# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`
# (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.)
tqdm.pandas(desc="my bar!")

# Now you can use `progress_apply` instead of `apply`
# and `progress_map` instead of `map`
df.progress_apply(lambda x: x**2)
# can also groupby:
# df.groupby(0).progress_apply(lambda x: x**2)

它甚至说“可以使用'tqdm_notebook'”,但我不知道如何使用。 我尝试了一些方法,比如:
tqdm_notebook(tqdm.pandas(desc="my bar!"))

或者

tqdm_notebook.pandas

但是它们不起作用。在定义中,对我来说看起来像是


tqdm.pandas(tqdm_notebook(desc="my bar!"))

应该可以工作,但进度条没有正确显示进度,并且仍然有其他输出。还有其他的想法吗?

似乎出现了一个错误。我也遇到了这个问题。使用groupby progress_apply可以解决... df.groupby(0).progress_apply(lambda x: x**2) - Julien Marrec
@JulienMarrec,我也没看出它与groupby一起使用的效果。我看到一个瞬间完成的绿色进度条,然后更新发生在另一个不太好看的进度条上,它紧挨着绿色进度条下面。 - grinsbaeckchen
是的,我也遇到了不太好看的进度条,但这个确实有效... 如果将来这里没有任何进展,可能值得前往 GitHub 提出问题。 - Julien Marrec
我可能会满意那个不太好看的进度条,但我仍然想知道为什么。我的笔记本似乎还有一些奇怪的依赖关系。如果我打开一个新的笔记本,一切都很好(虽然不太漂亮但是能用)。但在我的实际笔记本中,运行相同的导入和函数,在做了一些其他事情之后,进度条实际上不会更新自己,而是每次更新都在新行中。 - grinsbaeckchen
5个回答

63

这是我使用的工作解决方案(从文档中复制):

from tqdm.auto import tqdm
tqdm.pandas()

29
作为 tqdm 的维护者和文档的作者,我建议这样做。 - casper.dcl

19

您可以使用:

tqdm_notebook().pandas(*args, **kwargs)

这是因为tqdm_notebook具有延迟适配器,所以在访问其方法(包括类方法)之前必须实例化它。

在未来版本(>v5.1)中,您应该能够使用更统一的API:

tqdm_pandas(tqdm_notebook, *args, **kwargs)

谢谢,这解决了问题。不过它显示了两个条,一个是0次迭代,然后是想要的那个。你知道我能否摆脱它吗?或许你可以在回答中简要添加上述示例的用法,以便更容易理解。 - grinsbaeckchen
1
@grinsbaeckchen 这听起来像我们在笔记本电脑上遇到的一个旧问题,你能否提供一个带有截图的问题报告,以便我们修复它?谢谢! - gaborous

16

我发现我还需要导入tqdm_notebook。下面是一个在Jupyter notebook中有效的简单示例。

假设你想对变量执行函数映射,以创建你的pandas数据框中的新变量。

# progress bar
from tqdm import tqdm, tqdm_notebook

# instantiate
tqdm.pandas(tqdm_notebook)

# replace map with progress_map
# where df is a pandas dataframe
df['new_variable'] = df['old_variable'].progress_map(some_function)

6
如果您想在那个缓慢的应用步骤中使用多个CPU,考虑使用swifter。另外,swifter自动在apply步骤上启用了tqdm进度条。要自定义该条进度栏的描述,请使用:

df.swifter.progress_bar(enable=True, desc='bar description').apply(...)


1
from tqdm.notebook import tqdm

tqdm.pandas()

适用于版本4.64.0及更高版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接