Pandas新建计算列如何按固定间隔切换计算规则并保证性能
实现方案
直接用numpy向量化运算实现,无Python层面循环,性能远高于for循环和apply方法,百万行级数据也能毫秒级完成计算。
核心逻辑:先按位置匹配每个索引对应的减数,再一次性做数组减法,完全匹配指定循环规则:索引对4取模为0时(即0、4、8……位置)使用第二个减数,其余位置使用原始减数。
完整可运行代码如下:
import pandas as pd import numpy as np subtraction_value = 3 subtraction_value_2 = 6 # 补全原代码缺失的右括号 data = pd.DataFrame({"test":[12, 4, 5, 4, 1, 3, 2, 6, 10, 9]}) # 提取反转后的目标列,加.to_numpy()避免pandas索引对齐导致反转失效 reverse_col = data['test'][::-1] # 生成连续位置序列,避免自定义索引导致规则匹配错误 position = np.arange(len(data)) # 按规则批量生成对应减数数组 sub_arr = np.where(position % 4 == 0, subtraction_value_2, subtraction_value) # 直接计算得到新列 data['new_column'] = reverse_col - sub_arr
运行后打印data['new_column']即可得到预期输出:
0 6 1 1 2 2 3 1 4 -5 5 0 6 -1 7 3 8 4 9 6 Name: new_column, dtype: int64
注意:pandas中直接对Series用
[::-1]会保留原索引,直接运算时会按索引对齐导致值不反转,如果需要真正按顺序反转值,请将反转代码改为data['test'].to_numpy()[::-1]取到底层numpy数组再反转,不会出现索引对齐问题。
如果后续需要调整减数规则,比如增加更多档位的减数,可以替换np.where为np.select做多条件匹配,依然保持向量化运算的高性能。
内容的提问来源于stack exchange,提问作者Murray Ross
相关产品推荐
相关产品推荐

