Pandas无法覆盖DataFrame列赋值的问题该如何解决?
pandas链式索引赋值不生效问题解决
问题原因
- 你使用的
dataframe['upperband'][current]属于链式索引写法,pandas在处理这种语法时,无法保证返回的是原DataFrame的视图还是临时生成的副本:- 如果返回的是视图,赋值会修改原数据,这就是你其中一段代码生效的原因
- 如果返回的是副本,赋值只会修改临时副本对象,不会作用到原DataFrame,就会出现赋值不生效的情况
- 这种情况通常会伴随
SettingWithCopyWarning警告,如果你关闭了警告就看不到相关提示
修复方案
方案1:修改索引写法适配循环逻辑
把链式索引替换为pandas官方推荐的.loc定位方式,直接操作原DataFrame:
import pandas as pd # 示例初始数据 df = pd.DataFrame({'upperband': [1330, 1350, 1380, 1360, 1300, 1290]}) # 注:你原描述中的判断条件和预期结果不符,以下是按你给出的预期结果调整后的逻辑,如果需求确实是当前值大于前值时赋值,自行修改判断符号即可 for current in range(1, len(df)): if df.loc[current, 'upperband'] < df.loc[current-1, 'upperband']: df.loc[current, 'upperband'] = df.loc[current-1, 'upperband']
运行后即可得到你预期的输出结果。
方案2:使用向量化操作替代循环(更推荐)
你需要的输出本质就是upperband列的累积最大值,pandas内置的cummax()方法可以直接实现该需求,不需要手写循环,性能更高且不会出现索引类错误:
df['upperband'] = df['upperband'].cummax()
运行后直接得到预期结果:
| index | upperband |
|---|---|
| 0 | 1330 |
| 1 | 1350 |
| 2 | 1380 |
| 3 | 1380 |
| 4 | 1380 |
| 5 | 1380 |
内容的提问来源于stack exchange,提问作者chronovirus
相关产品推荐
相关产品推荐

