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

gri*_*hen 16 python pandas jupyter-notebook tqdm

我正在用一个jupyter笔记本中的pandas进行一些分析,因为我的apply函数需要很长时间才能看到进度条.通过这篇文章,我找到了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)
Run Code Online (Sandbox Code Playgroud)

它甚至说"可以使用'tqdm_notebook'",但我找不到怎样的方法.我尝试了一些类似的东西

tqdm_notebook(tqdm.pandas(desc="my bar!"))
Run Code Online (Sandbox Code Playgroud)

要么

tqdm_notebook.pandas
Run Code Online (Sandbox Code Playgroud)

但他们不起作用.在定义中它看起来像我

tqdm.pandas(tqdm_notebook(desc="my bar!"))
Run Code Online (Sandbox Code Playgroud)

应该工作,但酒吧没有正确显示进度,仍然有额外的输出.

还有其他想法吗?

mam*_*ins 13

我发现我也必须导入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)
Run Code Online (Sandbox Code Playgroud)


gab*_*ous 12

您可以使用:

tqdm_notebook().pandas(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这是因为tqdm_notebook有一个delayer适配器,因此在访问其方法(包括类方法)之前必须进行实例化.

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

tqdm_pandas(tqdm_notebook, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


Vin*_*ini 6

我的工作解决方案(从文档复制 ):

from tqdm.auto import tqdm
tqdm.pandas()
Run Code Online (Sandbox Code Playgroud)

  • 作为`tqdm`的维护者和上述文档的作者,我建议您这样做 (6认同)

cry*_*ick 6

如果您想在缓慢的应用步骤中使用 1 个以上的 CPU,请考虑使用swifter。作为奖励,swifter自动启用步骤tqdm上的进度条apply。要自定义栏描述,请使用:

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