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

2025-03-21 09:07:00
admin
原创
59
摘要:问题描述:在大多数情况下,它似乎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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用