You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas忽略时间列按行遍历 实现逐行动态系数乘法计算

Pandas按行应用不同乘法系数的高效实现

不要使用逐行遍历(iterrows/itertuples)或axis=1的apply实现,这类Python层循环的性能会随数据量增长快速下降,最优方案是利用Pandas/Numpy的广播机制做向量化运算,步骤如下:

  • 分离不需要参与计算的非数值列(本例为time列)
  • 按行索引生成对应权重:索引为i的行权重为10^i,将权重转换为n行×1列的数组结构适配广播规则
  • 对所有数值列直接做矩阵乘法,计算完成后合并回非数值列即可

实现代码

import pandas as pd
import numpy as np

# 测试数据集
time = ['11:50', '12:50', '13:50']
data_1 = {'time': time,
          'n1': [1, 5, 8],
          'n2': [2, 6 ,7],
          'n3': [3, 7 ,6],
          'n4': [4, 8, 5],
        }
df1 = pd.DataFrame(data = data_1)

# 核心计算逻辑
# 筛选所有需要参与计算的数值列,排除time列
num_cols = df1.columns.drop('time')
# 生成每行对应权重,转换为纵向数组适配广播
row_weights = 10 ** np.arange(len(df1)).reshape(-1, 1)
# 向量化批量计算
df1[num_cols] = df1[num_cols] * row_weights

结果验证

执行代码后输出的df1和预期结果完全一致:

索引timen1n2n3n4
011:501234
112:5050607080
213:50800700600500

方案优势

  • 性能极高:所有计算在C层完成,无Python级循环开销,百万行级数据也能毫秒级返回结果,性能是逐行apply方案的百倍以上
  • 扩展性强:不需要硬编码数值列名,后续新增n5/n6等数值列无需修改代码;如果要调整权重规则,仅需修改row_weights的生成逻辑即可(比如将底数10替换为2即可实现每行乘2的对应次幂)

注意:不要使用df.apply(lambda x: x * 10**x.name, axis=1)这类写法,axis=1的apply本质是逐行封装为Series传入Python函数计算,数据量较大时延迟会非常明显。

内容的提问来源于stack exchange,提问作者n3a5p7s9t1e3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:15:43