# Buggy code
def pandas(tclass, *targs, **tkwargs):
    """
    Registers the given `tqdm` class with
        pandas.core.
        ( frame.DataFrame
        | series.Series
        | groupby.DataFrameGroupBy
        | groupby.SeriesGroupBy
        ).progress_apply

    A new instance will be create every time `progress_apply` is called,
    and each instance will automatically close() upon completion.

    Parameters
    ----------
    targs, tkwargs  : arguments for the tqdm instance

    Examples
    --------
    >>> import pandas as pd
    >>> import numpy as np
    >>> from tqdm import tqdm, tqdm_gui
    >>>
    >>> df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
    >>> tqdm.pandas(ncols=50)  # can use tqdm_gui, optional kwargs, etc
    >>> # Now you can use `progress_apply` instead of `apply`
    >>> df.groupby(0).progress_apply(lambda x: x**2)

    References
    ----------
    https://stackoverflow.com/questions/18603270/
    progress-indicator-during-pandas-operations-python
    """
    from pandas.core.frame import DataFrame
    from pandas.core.series import Series
    from pandas.core.groupby import DataFrameGroupBy
    from pandas.core.groupby import SeriesGroupBy
    from pandas.core.groupby import GroupBy
    from pandas.core.groupby import PanelGroupBy
    from pandas import Panel

    deprecated_t = [tkwargs.pop("deprecated_t", None)]

    def inner_generator(df_function="apply"):
        def inner(df, func, *args, **kwargs):
            """
            Parameters
            ----------
            df  : (DataFrame|Series)[GroupBy]
                Data (may be grouped).
            func  : function
                To be applied on the (grouped) data.
            *args, *kwargs  : optional
                Transmitted to `df.apply()`.
            """
            # Precompute total iterations
            total = getattr(df, "ngroups", None)
            if total is None:  # not grouped
                total = len(df) if isinstance(df, Series) else df.size // len(df)
            else:
                total += 1  # pandas calls update once too many

            # Init bar
            if deprecated_t[0] is not None:
                t = deprecated_t[0]
                deprecated_t[0] = None
            else:
                t = tclass(*targs, total=total, **tkwargs)

            # Define bar updating wrapper
            def wrapper(*args, **kwargs):
                t.update()
                return func(*args, **kwargs)

            # Apply the provided function (in *args and **kwargs)
            # on the df using our wrapper (which provides bar updating)
            result = getattr(df, df_function)(wrapper, *args, **kwargs)

            # Close bar and return pandas calculation result
            t.close()
            return result

        return inner

    # Monkeypatch pandas to provide easy methods
    # Enable custom tqdm progress in pandas!
    Series.progress_apply = inner_generator()
    SeriesGroupBy.progress_apply = inner_generator()
    Series.progress_map = inner_generator("map")
    SeriesGroupBy.progress_map = inner_generator("map")

    DataFrame.progress_apply = inner_generator()
    DataFrameGroupBy.progress_apply = inner_generator()
    DataFrame.progress_applymap = inner_generator("applymap")

    Panel.progress_apply = inner_generator()
    PanelGroupBy.progress_apply = inner_generator()

    GroupBy.progress_apply = inner_generator()
    GroupBy.progress_aggregate = inner_generator("aggregate")
    GroupBy.progress_transform = inner_generator("transform")


# Traceback (RuntimeError)
[s1758208@login04(eddie) ~]$ conda create -n test
[s1758208@login04(eddie) ~]$ conda activate test
(test) [s1758208@login04(eddie) ~]$ conda install python
Solving environment: done

## Package Plan ##

environment location: /exports/csce/eddie/ph/groups/rbm_ml/michael/myconda/envs/test

added / updated specs:
- python


The following packages will be downloaded:

package                    |            build
---------------------------|-----------------
python-3.6.4               |       hc3d631a_3        29.1 MB
libstdcxx-ng-7.2.0         |       hdf63c60_3         2.5 MB
certifi-2018.1.18          |           py36_0         144 KB
zlib-1.2.11                |       ha838bed_2         101 KB
sqlite-3.22.0              |       h1bed415_0         1.5 MB
wheel-0.30.0               |   py36hfd4bba0_1          67 KB
openssl-1.0.2n             |       hb7f436b_0         3.4 MB
libffi-3.2.1               |       hd88cf55_4          43 KB
libgcc-ng-7.2.0            |       hdf63c60_3         6.1 MB
ncurses-6.0                |       h9df7e31_2         920 KB
tk-8.6.7                   |       hc745277_3         3.2 MB
setuptools-38.5.1          |           py36_0         525 KB
pip-9.0.1                  |           py36_5         2.2 MB
libedit-3.1                |       heed3624_0         171 KB
ca-certificates-2017.08.26 |       h1d4fec5_0         263 KB
------------------------------------------------------------
Total:        50.2 MB

The following NEW packages will be INSTALLED:

ca-certificates: 2017.08.26-h1d4fec5_0
certifi:         2018.1.18-py36_0
libedit:         3.1-heed3624_0
libffi:          3.2.1-hd88cf55_4
libgcc-ng:       7.2.0-hdf63c60_3
libstdcxx-ng:    7.2.0-hdf63c60_3
ncurses:         6.0-h9df7e31_2
openssl:         1.0.2n-hb7f436b_0
pip:             9.0.1-py36_5
python:          3.6.4-hc3d631a_3
readline:        7.0-ha6073c6_4
setuptools:      38.5.1-py36_0
sqlite:          3.22.0-h1bed415_0
tk:              8.6.7-hc745277_3
wheel:           0.30.0-py36hfd4bba0_1
xz:              5.2.3-h55aa19d_2
zlib:            1.2.11-ha838bed_2

Proceed ([y]/n)? y


Downloading and Extracting Packages
python 3.6.4: ########################################################## | 100%
libstdcxx-ng 7.2.0: #################################################### | 100%
certifi 2018.1.18: ##################################################### | 100%

# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

Traceback (most recent call last):
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/exceptions.py", line 789, in __call__
return func(*args, **kwargs)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/cli/main.py", line 78, in _main
exit_code = do_call(args, p)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/cli/conda_argparse.py", line 77, in do_call
exit_code = getattr(module, func_name)(args, parser)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/cli/main_install.py", line 11, in execute
install(args, parser, 'install')
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/cli/install.py", line 255, in install
handle_txn(progressive_fetch_extract, unlink_link_transaction, prefix, args, newenv)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/cli/install.py", line 281, in handle_txn
progressive_fetch_extract.execute()
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/core/package_cache.py", line 584, in execute
exc = self._execute_actions(prec_or_spec, prec_actions)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/core/package_cache.py", line 599, in _execute_actions
progress_bar = ProgressBar(desc, not context.verbosity and not context.quiet, context.json)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/common/io.py", line 390, in __init__
self.pbar = tqdm(desc=description, bar_format=bar_format, ascii=True, total=1)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/_vendor/tqdm/_tqdm.py", line 388, in __new__
cls.monitor = TMonitor(cls, cls.monitor_interval)
File "/home/s1758208/miniconda3/lib/python3.6/site-packages/conda/_vendor/tqdm/_tqdm.py", line 83, in __init__
self.start()
File "/home/s1758208/miniconda3/lib/python3.6/threading.py", line 846, in start
_start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread

# Fixed code
def pandas(tclass, *targs, **tkwargs):
    """
    Registers the given `tqdm` class with
        pandas.core.
        ( frame.DataFrame
        | series.Series
        | groupby.DataFrameGroupBy
        | groupby.SeriesGroupBy
        ).progress_apply
    A new instance will be create every time `progress_apply` is called,
    and each instance will automatically close() upon completion.
    Parameters
    ----------
    targs, tkwargs  : arguments for the tqdm instance
    Examples
    --------
    >>> import pandas as pd
    >>> import numpy as np
    >>> from tqdm import tqdm, tqdm_gui
    >>>
    >>> df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
    >>> tqdm.pandas(ncols=50)  # can use tqdm_gui, optional kwargs, etc
    >>> # Now you can use `progress_apply` instead of `apply`
    >>> df.groupby(0).progress_apply(lambda x: x**2)
    References
    ----------
    https://stackoverflow.com/questions/18603270/
    progress-indicator-during-pandas-operations-python
    """
    from pandas.core.frame import DataFrame
    from pandas.core.series import Series
    from pandas.core.groupby import DataFrameGroupBy
    from pandas.core.groupby import SeriesGroupBy
    from pandas.core.groupby import GroupBy
    from pandas.core.groupby import PanelGroupBy
    from pandas import Panel

    deprecated_t = [tkwargs.pop("deprecated_t", None)]

    def inner_generator(df_function="apply"):
        def inner(df, func, *args, **kwargs):
            """
            Parameters
            ----------
            df  : (DataFrame|Series)[GroupBy]
                Data (may be grouped).
            func  : function
                To be applied on the (grouped) data.
            **kwargs  : optional
                Transmitted to `df.apply()`.
            """

            # Precompute total iterations
            total = getattr(df, "ngroups", None)
            if total is None:  # not grouped
                if df_function == "applymap":
                    total = df.size
                elif isinstance(df, Series):
                    total = len(df)
                else:  # DataFrame or Panel
                    axis = kwargs.get("axis", 0)
                    # when axis=0, total is shape[axis1]
                    total = df.size // df.shape[axis]

            # Init bar
            if deprecated_t[0] is not None:
                t = deprecated_t[0]
                deprecated_t[0] = None
            else:
                t = tclass(*targs, total=total, **tkwargs)

            if len(args) > 0:
                # *args intentionally not supported (see #244, #299)
                TqdmDeprecationWarning(
                    "Except func, normal arguments are intentionally"
                    + " not supported by"
                    + " `(DataFrame|Series|GroupBy).progress_apply`."
                    + " Use keyword arguments instead.",
                    fp_write=getattr(t.fp, "write", sys.stderr.write),
                )

            # Define bar updating wrapper
            def wrapper(*args, **kwargs):
                # update tbar correctly
                # it seems `pandas apply` calls `func` twice
                # on the first column/row to decide whether it can
                # take a fast or slow code path; so stop when t.total==t.n
                t.update(n=1 if t.total and t.n < t.total else 0)
                return func(*args, **kwargs)

            # Apply the provided function (in **kwargs)
            # on the df using our wrapper (which provides bar updating)
            result = getattr(df, df_function)(wrapper, **kwargs)

            # Close bar and return pandas calculation result
            t.close()
            return result

        return inner

    # Monkeypatch pandas to provide easy methods
    # Enable custom tqdm progress in pandas!
    Series.progress_apply = inner_generator()
    SeriesGroupBy.progress_apply = inner_generator()
    Series.progress_map = inner_generator("map")
    SeriesGroupBy.progress_map = inner_generator("map")

    DataFrame.progress_apply = inner_generator()
    DataFrameGroupBy.progress_apply = inner_generator()
    DataFrame.progress_applymap = inner_generator("applymap")

    Panel.progress_apply = inner_generator()
    PanelGroupBy.progress_apply = inner_generator()

    GroupBy.progress_apply = inner_generator()
    GroupBy.progress_aggregate = inner_generator("aggregate")
    GroupBy.progress_transform = inner_generator("transform")