如何正确编写pandas DataFrame的for循环实现新列计算?
pandas实现f_adj列差分计算生成df列
原代码问题
你写的代码存在三个核心错误:
- 取值语法完全错误:
df1['df'[i]]是对字符串'df'取第i位字符,根本不是对DataFrame的列、行做索引,pandas正确的行列取值语法是df.loc[行标识, 列名]或者按位置取的df.iloc[行位置, 列位置] - 逐行for循环是pandas里最低效的写法,数据量稍大就会卡顿,这个差分逻辑完全没必要用循环实现
- 边界值处理错误:第一行没有上一行、最后一行没有下一行,本来就无法满足计算逻辑,初始赋值为0会给后续计算引入错误值,应该填充空值。
推荐实现(无循环,向量化运算,性能最优)
直接用pandas内置的shift位移方法就能一行实现,不需要写任何循环:
import numpy as np # 初始化新列,默认空值 df1['df'] = np.nan # shift(-1) 取当前行的下一行值,shift(1)取当前行的上一行值,自动按索引对齐 df1['df'] = df1['f_adj'].shift(-1) - df1['f_adj'].shift(1)
这个写法是pandas原生的向量化运算,执行效率比手写for循环高几十到上百倍,也不会出现索引语法错误,首尾两行因为没有对应上下行值,会自动填充为NaN,符合计算逻辑。
非要用for循环的正确写法(仅作语法演示,不推荐生产环境用)
如果你一定要练习for循环写法,正确代码如下,注意要严格遵守pandas的索引规则:
import numpy as np df1['df'] = np.nan # 遍历行位置,首尾行跳过 for pos in range(1, len(df1)-1): # 按位置取对应行索引,避免DataFrame索引不是连续0开始值时出错 current_idx = df1.index[pos] prev_idx = df1.index[pos-1] next_idx = df1.index[pos+1] df1.loc[current_idx, 'df'] = df1.loc[next_idx, 'f_adj'] - df1.loc[prev_idx, 'f_adj']
内容的提问来源于stack exchange,提问作者Pianissimo
相关产品推荐
相关产品推荐

