为什么有时在 Pandas 数据框中应用并不比 for 循环更快?

2025-03-21 09:07:00
admin
原创
84
摘要:问题描述:在大多数情况下,它似乎apply可以加速数据框上的操作过程,但是,当我使用时,apply我发现加速并不明显。这是我的示例;我有一个包含两列的数据框:>>>df index col1 col2 1 10 20 2 20 30 3 30 40 R(x)我想要做的是通过实现一个函数来计算...

问题描述:

在大多数情况下,它似乎apply可以加速数据框上的操作过程,但是,当我使用时,apply我发现加速并不明显。这是我的示例;我有一个包含两列的数据框:

>>>df
index col1 col2
1 10 20
2 20 30
3 30 40

R(x)我想要做的是通过实现一个函数来计算数据框中每一行的值col1,然后将结果除以中的值col2。例如,第一行的结果应该是R(10)/20

这是我的函数,将在以下位置调用apply

def _f(input):
    return R(input['col1'])/input['col2']

然后我_f打电话applydf.apply(_f, axis=1)

但是,我发现在这种情况下,apply比 for 循环慢得多,例如

for i in list(df.index)
    new_df.loc[i] = R(df.loc[i,'col1'])/df.loc[i,'col2']

有人能解释一下原因吗?


解决方案 1:

据我所知,这通常不会.apply比轴上的迭代更快。我相信在底层它只是轴上的一个循环,只不过在这种情况下每次都会产生函数调用的开销。

如果我们查看源代码,我们可以看到,本质上我们正在遍历指示的轴并应用函数,将各个结果作为系列构建到字典中,最后调用字典上的数据框构造函数返回一个新的 DataFrame:

    if axis == 0:
        series_gen = (self._ixs(i, axis=1)
                      for i in range(len(self.columns)))
        res_index = self.columns
        res_columns = self.index
    elif axis == 1:
        res_index = self.index
        res_columns = self.columns
        values = self.values
        series_gen = (Series.from_array(arr, index=res_columns, name=name,
                                        dtype=dtype)
                      for i, (arr, name) in enumerate(zip(values,
                                                          res_index)))
    else:  # pragma : no cover
        raise AssertionError('Axis must be 0 or 1, got %s' % str(axis))

    i = None
    keys = []
    results = {}
    if ignore_failures:
        successes = []
        for i, v in enumerate(series_gen):
            try:
                results[i] = func(v)
                keys.append(v.name)
                successes.append(i)
            except Exception:
                pass
        # so will work with MultiIndex
        if len(successes) < len(res_index):
            res_index = res_index.take(successes)
    else:
        try:
            for i, v in enumerate(series_gen):
                results[i] = func(v)
                keys.append(v.name)
        except Exception as e:
            if hasattr(e, 'args'):
                # make sure i is defined
                if i is not None:
                    k = res_index[i]
                    e.args = e.args + ('occurred at index %s' %
                                       pprint_thing(k), )
            raise

    if len(results) > 0 and is_sequence(results[0]):
        if not isinstance(results[0], Series):
            index = res_columns
        else:
            index = None

        result = self._constructor(data=results, index=index)
        result.columns = res_index

        if axis == 1:
            result = result.T
        result = result._convert(datetime=True, timedelta=True, copy=False)

    else:

        result = Series(results)
        result.index = res_index

    return result

具体来说:

for i, v in enumerate(series_gen):
                results[i] = func(v)
                keys.append(v.name)

series_gen根据请求的轴构建的位置。

为了获得更好的功能性能,您可以遵循此处给出的建议。

本质上,您的选择是:

  1. 编写 C 扩展

  2. 使用numba(JIT 编译器)

  3. 用于pandas.eval提高大型 Dataframe 的性能

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用