Numpy/Pandas中每行后插入仅单列递减相似行的高效方法
问题原因
你原有代码的逻辑是先把所有原始行放在最前面,再把所有生成的递减行拼在末尾,自然无法实现新行跟在对应原行后方的要求,同时纯Python循环的执行效率远低于向量化操作。
Numpy 高效实现
核心思路是先按每行最后一列的数值确定重复次数,批量复制行后统一替换最后一列的递减值:
import numpy as np A = np.array([[23, 43, 23, 110, 5], [83, 32, 12, 123, 4], [58, 41, 59, 189, 1], [93, 77, 22, 170, 3]]) # 计算每行需要生成的行数:从原值降到0共(原值+1)行 repeat_counts = A[:, 4] + 1 # 批量重复原行,得到结构正确的基础数组 result = np.repeat(A, repeat_counts, axis=0) # 生成所有行最后一列的递减序列 last_col = np.concatenate([np.arange(val, -1, -1) for val in A[:, 4]]) # 替换最后一列 result[:, 4] = last_col
Pandas 简洁实现
用explode方法更简洁,适合原本就是DataFrame格式的业务场景:
import pandas as pd df = pd.DataFrame(A) # 为每行生成最后一列的递减值列表,再炸开为多行 df[4] = df[4].apply(lambda x: list(range(x, -1, -1))) result_df = df.explode(4, ignore_index=True) # 如需转numpy数组,调用result_df.to_numpy()即可
性能说明
两种方案底层均为C实现的向量化操作,避免了纯Python循环的高额开销,对于4000条原始数据的场景,执行时间均在毫秒级,完全满足业务效率要求。
内容的提问来源于stack exchange,提问作者Shaun Han
相关产品推荐
相关产品推荐

