如何在 jupyter notebook 中使用带有 pandas 的 tqdm?
How to use tqdm with pandas in a jupyter notebook?
我正在 jupyter notebook 中使用 pandas 进行一些分析,由于我的应用函数需要很长时间,所以我希望看到一个进度条。
通过这个posthere I found the tqdm library that provides a simple progress bar for pandas operations。
还有一个 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)
它甚至说 "can use 'tqdm_notebook' " 但我找不到方法。
我试过一些东西,比如
tqdm_notebook(tqdm.pandas(desc="my bar!"))
或
tqdm_notebook.pandas
但它们不起作用。
在 definition 它看起来像
tqdm.pandas(tqdm_notebook(desc="my bar!"))
应该可以,但是进度条没有正确显示进度,而且还有额外的输出。
还有其他想法吗?
您可以使用:
tqdm_notebook().pandas(*args, **kwargs)
这是因为tqdm_notebook有一个延迟器适配器,所以在访问它的方法(包括class方法)之前需要实例化它。
以后(>v5.1),你应该可以使用更统一的API:
tqdm_pandas(tqdm_notebook, *args, **kwargs)
我发现我还必须导入 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)
我的工作解决方案(从documentation复制):
from tqdm.auto import tqdm
tqdm.pandas()
如果您想为那个缓慢的应用步骤使用超过 1 个 CPU,请考虑使用 swifter。作为奖励,swifter
会自动在 apply
步骤上启用 tqdm
进度条。要自定义条形描述,请使用:
df.swifter.progress_bar(enable=True, desc='bar description').apply(...)
我正在 jupyter notebook 中使用 pandas 进行一些分析,由于我的应用函数需要很长时间,所以我希望看到一个进度条。 通过这个posthere I found the tqdm library that provides a simple progress bar for pandas operations。 还有一个 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)
它甚至说 "can use 'tqdm_notebook' " 但我找不到方法。 我试过一些东西,比如
tqdm_notebook(tqdm.pandas(desc="my bar!"))
或
tqdm_notebook.pandas
但它们不起作用。 在 definition 它看起来像
tqdm.pandas(tqdm_notebook(desc="my bar!"))
应该可以,但是进度条没有正确显示进度,而且还有额外的输出。
还有其他想法吗?
您可以使用:
tqdm_notebook().pandas(*args, **kwargs)
这是因为tqdm_notebook有一个延迟器适配器,所以在访问它的方法(包括class方法)之前需要实例化它。
以后(>v5.1),你应该可以使用更统一的API:
tqdm_pandas(tqdm_notebook, *args, **kwargs)
我发现我还必须导入 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)
我的工作解决方案(从documentation复制):
from tqdm.auto import tqdm
tqdm.pandas()
如果您想为那个缓慢的应用步骤使用超过 1 个 CPU,请考虑使用 swifter。作为奖励,swifter
会自动在 apply
步骤上启用 tqdm
进度条。要自定义条形描述,请使用:
df.swifter.progress_bar(enable=True, desc='bar description').apply(...)