39

我在 jupyter notebook 中对 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)

它甚至说“可以使用'tqdm_notebook'”但我没有找到方法。我尝试了一些事情,比如

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

或者

tqdm_notebook.pandas

但他们不工作。在定义中它看起来像

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

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

还有其他想法吗?

4

4 回答 4

48

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

from tqdm.auto import tqdm
tqdm.pandas()
于 2019-05-03T14:57:12.997 回答
17

您可以使用:

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

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

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

tqdm_pandas(tqdm_notebook, *args, **kwargs)
于 2016-12-29T13:44:20.560 回答
15

我发现我也必须导入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)
于 2019-02-13T14:59:26.660 回答
4

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

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

于 2020-11-04T02:13:14.793 回答