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

Python中基于后续样本修改DataFrame列值的性能优化咨询

高效修改DataFrame列值的解决方案

现有一个按时间排序的DataFrame,结构如下:

Col1Col2
0.31
0.220
0.890
0.121
0.540
0.111

其中Col2为二进制列,需求如下:

  • 除最后1行外,每行的Col2值修改为:后续最多2个样本中若存在1则设为1,否则为0(倒数第二行仅需看后续1个样本)
  • 最后1行保持不变

预期结果:

Col1Col2
0.30
0.221
0.891
0.121
0.541
0.111

当前使用循环实现,但大数据集下运行效率极低,原代码如下:

for i, j in df.iterrows():
   if i < df.shape[0]-2:
       df.iloc[i]['Col2'] = max([df.iloc[j]['Col2'] for j in range(i,i+2)])

高效解决方案

利用Pandas的向量化操作替代循环,大幅提升计算效率,核心思路是通过shift获取后续行的值,再用combine计算最大值:

import pandas as pd

# 构造示例数据(实际使用时替换为你的DataFrame)
data = {'Col1': [0.3, 0.22, 0.89, 0.12, 0.54, 0.11],
        'Col2': [1, 0, 0, 1, 0, 1]}
df = pd.DataFrame(data)

# 获取后续1行和后续2行的Col2值
next_1 = df['Col2'].shift(-1)
next_2 = df['Col2'].shift(-2)

# 计算后续最多2个样本的最大值:当后续2行不存在时,取后续1行的值
df['Col2'] = next_1.combine(next_2, max, fill_value=next_1)

# 恢复最后1行的原始值
df.iloc[-1, df.columns.get_loc('Col2')] = data['Col2'][-1]

print(df)

代码说明

  1. shift(-1)/shift(-2):分别获取当前行的后1行、后2行的Col2值,末尾行的移位结果为NaN
  2. combine:对next_1和next_2逐行取最大值,当next_2为NaN(即倒数第二行)时,用next_1填充计算
  3. 恢复最后一行:确保最后一行保持原始值不变

这种向量化操作避免了循环遍历每行,计算效率远高于iterrows循环,尤其适合大数据集场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:53:23