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
相关产品推荐
相关产品推荐

