Pandas DataFrame指定列当前行值大于前一行时替换为前值的问题求解
解决方法
你原有的代码存在3个核心问题:
- 索引越界:循环内调用
i+1取值,当i走到最后一行的索引时,i+1超出了DataFrame的长度范围 - 逻辑反向:你的需求是当前行大于上一行时替换为上一行的值,但原代码判断的是当前行小于下一行时把当前行替换为下一行的值,和需求完全相反
- 直接循环修改Pandas对象效率极低,还容易触发
SettingWithCopyWarning,不推荐用循环实现该逻辑
正确实现(一行代码即可)
你的需求本质是将目标列转换为单调非递增序列,也就是每一行取值不大于上一行,直接用Pandas内置的cummin()(累计最小值)方法即可实现:
import pandas as pd # 读取文件 df = pd.read_csv("M10_10.txt") # 对m_Crit200列做处理 df['m_Crit200'] = df['m_Crit200'].cummin()
效果验证
拿你给出的示例测试:
原始Value列: 0 10 1 7 2 6 3 12 4 3 5 2 6 1
调用.cummin()后输出:
0 10 1 7 2 6 3 6 4 3 5 2 6 1
完全符合预期效果。
之前结果错误的原因
你之前用到的方法大概率是用了和需求逻辑反向的累计最大值cummax(),或者错误的比较逻辑,才会出现当前行比上一行大仍然保留的情况,用上述cummin()方法即可解决。
内容的提问来源于stack exchange,提问作者OjoTuerto
相关产品推荐
相关产品推荐

