首页 > 解决方案 > 更新单个数据帧行中的多列的最有效方法

问题描述

line_profiler 向我展示了令人惊讶的(对我而言)结果,即更新单行中的两列作为两个语句而不是一个组合语句执行得更快。

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   696      6907   42029943.0   6085.1      4.7    df_work.loc[self.iRow, 'status'] = 'X'
   697      6907   68856814.0   9969.1      7.7    df_work.loc[self.iRow, 'clock'] = self.dClock
   698      6907  178155598.0  25793.5     19.9    df_work.loc[self.iRow, ['status', 'clock']] = ['L', self.dClock]

第 696 行和第 697 行合计耗时 11 秒,而等效的第 698 行耗时 18 秒,因此 2 个单独的更新比单个更新语句快 40%。我反复看到这种模式。我假设单个更新会运行得更快,在我恢复我的代码之前,我想检查是否有一种更有效的方法可以在一行中一次更新一列。谢谢!

标签: pythonpandasdataframe

解决方案


经过未来的研究,解决方案是切换到 iat 而不是 loc。

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   673      6907    5209397.0    754.2      1.7  df_work.iat[self.iRow, cols_work['clock']] = self.dClock

每次命中时间从 9969 减少到 754。

我初始化了字典,将列名转换为列号,以便与 iat 一起使用,如下所示:

    cols_work = {}
    for col in df_work.columns:
        cols_work[col] = len(cols_work)

推荐阅读