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

Pandas中iterrows()结合if语句给新列赋值失败求助

问题分析与解决

直接修复你的遍历代码

你的代码里有两个明显错误导致赋值失败:

  • iloc使用错误:iloc是基于位置的索引,第二个参数不能用列名'NR7',要么改用loc(基于标签的索引),要么用列的整数位置。
  • 赋值内容错误:你赋值了列表['NR4'],但应该直接赋值字符串'NR4'。

修改后的遍历代码:

import pandas as pd
import numpy as np

path = '/Users/chri....in/Documents/Python_Script/dataset/'
df = pd.read_csv(path+'AAPL.csv')

df['SMA10'] = df['Close'].rolling(10).mean()
df['ADR20'] = ((df['High'].rolling(20).mean()/df['Low'].rolling(20).mean())-1)*100
df['ADR1'] = (df['High']/df['Low']-1)*100
df['Range'] = df['High']-df['Low']
df['NR7'] = 'na'

for i, row in df.iterrows():
    # 跳过第一行避免索引越界
    if i >= 1 and df.iloc[i]['Range'] < df.iloc[i-1]['Range']: 
        # 用loc按行标签+列名赋值
        df.loc[i, 'NR7'] = 'NR4'
        # 或者用iloc指定列位置:df.iloc[i, df.columns.get_loc('NR7')] = 'NR4'

更符合Pandas风格的NR7判断方法

Pandas的核心是向量化操作,比遍历iterrows效率高得多,也更简洁。NR7的定义是「当前K线的振幅(Range)是过去7根K线(含当前)中的最小值」,直接用rolling窗口实现:

import pandas as pd
import numpy as np

path = '/Users/chri....in/Documents/Python_Script/dataset/'
df = pd.read_csv(path+'AAPL.csv')

# 计算各类指标
df['SMA10'] = df['Close'].rolling(10).mean()
df['ADR20'] = ((df['High'].rolling(20).mean()/df['Low'].rolling(20).mean())-1)*100
df['ADR1'] = (df['High']/df['Low']-1)*100
df['Range'] = df['High']-df['Low']

# 初始化NR7列
df['NR7'] = 'na'

# 判断NR7:当前Range是过去7个窗口中的最小值
df.loc[df['Range'] == df['Range'].rolling(7).min(), 'NR7'] = 'NR7'

# 如果是判断NR4(过去4根最小),只需修改窗口大小
# df.loc[df['Range'] == df['Range'].rolling(4).min(), 'NR7'] = 'NR4'

为什么不推荐用iterrows?

  • 效率极低:数据量较大时,遍历速度比向量化操作慢几十甚至上百倍。
  • 易出错:遍历中修改DataFrame可能导致索引混乱,触发Pandas警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:35:24