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

Pandas计算新列时如何基于重赋值后的上一行值逐行比较

问题根源

原有实现基于原始A列做shift()取值,所有计算逻辑都引用未修改的原始列值,不会复用前序行更新后的计算结果,因此索引为2的行对比的是原始A列上一行的19,而非上一行更新后的值16,导致结果不符合预期。
你描述的赋值规则本质是计算序列从开头到当前位置的累计最小值,优先使用pandas内置向量化方法实现,性能远高于逐行循环。

解决方案

方法1:内置累计最小值函数(推荐,性能最优)

直接调用cummin()方法即可实现需求,代码简洁且运行效率最高:

import pandas as pd
import numpy as np
d={'A':[16,19,18,15,13,16]}
df = pd.DataFrame(d)
# 若需要和示例输出一致的float类型,可在cummin()后加.astype(float)
df['A_changed'] = df['A'].cummin()
print(df)

运行输出完全匹配预期结果:

A  A_changed
0  16         16
1  19         16
2  18         16
3  15         15
4  13         13
5  16         13

方法2:逐行迭代赋值(适配复杂逻辑场景)

如果后续判断逻辑更复杂,无法直接用内置累计函数实现,可以逐行遍历,每次引用上一行已更新的值做判断:

import pandas as pd
import numpy as np
d={'A':[16,19,18,15,13,16]}
df = pd.DataFrame(d)
# 初始化结果列,首行值和原列首行一致
df['A_changed'] = df['A']
# 从第二行(索引1)开始遍历
for i in range(1, len(df)):
    prev_updated = df.loc[i-1, 'A_changed']
    curr_origin = df.loc[i, 'A']
    if curr_origin > prev_updated:
        df.loc[i, 'A_changed'] = prev_updated
print(df)

注意:逐行迭代在数据量较大(十万行以上)时性能明显弱于内置向量化方法,无特殊需求优先选方法1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:39:19