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和预期结果完全一致:
| 索引 | time | n1 | n2 | n3 | n4 |
|---|---|---|---|---|---|
| 0 | 11:50 | 1 | 2 | 3 | 4 |
| 1 | 12:50 | 50 | 60 | 70 | 80 |
| 2 | 13:50 | 800 | 700 | 600 | 500 |
方案优势
- 性能极高:所有计算在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
相关产品推荐
相关产品推荐

