如何在 jupyter 笔记本中将 tqdm 与 pandas 一起使用?

Posted

技术标签:

【中文标题】如何在 jupyter 笔记本中将 tqdm 与 pandas 一起使用?【英文标题】:How to use tqdm with pandas in a jupyter notebook? 【发布时间】:2017-03-21 11:24:36 【问题描述】:

我正在 jupyter 笔记本中对 pandas 进行一些分析,由于我的应用功能需要很长时间,我希望看到一个进度条。 通过这篇here 的帖子,我找到了为pandas operations 提供简单进度条的tqdm 库。 还有一个 Jupyter integration 提供了一个非常好的进度条,进度条本身会随着时间而变化。

但是,我想将两者结合起来,但不太了解如何做到这一点。 让我们以与文档中相同的示例为例

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

但它们不起作用。 在definition 中,我觉得它像

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

应该可以,但是栏没有正确显示进度并且还有额外的输出。

还有其他想法吗?

【问题讨论】:

似乎有错误。我也在经历。它适用于 groupby progress_apply...df.groupby(0).progress_apply(lambda x: x**2) @JulienMarrec,我看不出它也适用于 groupby。我得到一个立即完整的绿色条,然后更新发生在另一个不太漂亮的条上,它在绿色条下方更新。 是的,我也得到了不太漂亮的栏,但是这个栏有效......如果将来这里没有牵引力,也许值得前往 GitHub 来打开一个问题 我可能会对不太漂亮的酒吧感到满意,但我仍然想知道为什么。我的笔记本似乎也有一些奇怪的依赖性。如果我打开一个新笔记本,一切都很好(不漂亮但可以工作)。但是在我的实际笔记本中,在执行了一些其他操作后运行相同的导入和功能,该栏实际上并没有更新自己,但每次更新都在一个新行中 【参考方案1】:

我的工作解决方案(复制自documentation):

from tqdm.auto import tqdm
tqdm.pandas()

【讨论】:

作为tqdm 的维护者和上述文档的作者,我推荐这个【参考方案2】:

你可以使用:

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

这是因为 tqdm_notebook 有一个延迟器适配器,所以需要在访问它的方法(包括类方法)之前实例化它。

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

tqdm_pandas(tqdm_notebook, *args, **kwargs)

【讨论】:

谢谢,这解决了问题。然而,它显示了两个条而不是一个,一个具有 0 次迭代,然后是想要的一个。你知道我能不能摆脱它吗?也许您可以很快将上述示例的用法添加到您的答案中,以便更容易掌握。 @grinsbaeckchen 这听起来像是我们在笔记本上遇到的一个老错误,你能不能 report in an issue 附上截图以便我们修复它?谢谢!【参考方案3】:

我发现我还必须导入 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)

【讨论】:

【参考方案4】:

如果您想为这个缓慢的应用步骤使用超过 1 个 CPU,请考虑使用 swifter。作为奖励,swifterapply 步骤上自动启用tqdm 进度条。要自定义条形描述,请使用:

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

【讨论】:

以上是关于如何在 jupyter 笔记本中将 tqdm 与 pandas 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter Notebook 中的 tqdm 重复打印新的进度条

如何在 Jupyter 笔记本中将列表输出为表格?

如何在jupyter笔记本中将python字符串显示为HTML

Python tqdm 导入检查 jupyter notebook 或 lab 是不是正在运行

在 Jupyter 中将 PySpark 数据帧打印为格式化表

使用 jupyterlab 在 Jupiter 笔记本中使用 read_csv 时如何使用 tqdm 显示进度条