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

