pandas实现间隔行逐列求比率减1及解决类型报错问题
报错原因
你触发TypeError: can only concatenate str (not "int") to str的核心原因是for i in df的写法遍历的是DataFrame的列名(字符串类型的表头值),直接对字符串做加整数的操作自然会报类型错误。同时你的现有代码逻辑和目标计算规则不匹配:既写错了行间隔数,循环赋值的方式也无法得到全表计算结果。
实现方法
优先用pandas原生向量化运算,不需要写循环,运行效率更高,逻辑也更简单:
import pandas as pd # 实现逻辑:df向上移4行后,逐位置除以原df再减1,和你要的第i+4行/第i行-1规则完全对齐 df_result = df.shift(-4) / df - 1
计算完成后,结果表最后4行因为没有对应的i+4行数据,会返回空值NaN,如果不需要空值直接加一行删除即可:
df_result = df_result.dropna()
如果你一定要用iloc按行遍历实现(不推荐,数据量大时运行速度会慢很多),正确写法如下:
res = [] # 行索引只遍历到倒数第5行,避免i+4超出表的总行数范围 for i in range(len(df) - 4): row_calc = df.iloc[i+4] / df.iloc[i] - 1 res.append(row_calc) # 结果列表转成和原表列名一致的DataFrame df1 = pd.DataFrame(res, columns=df.columns)
原代码的具体问题
- 遍历对象错误:直接遍历
df拿到的是列名字符串,不是行序号,无法做数值加减 - 计算间隔错误:你写的
i+54和目标的i+4间隔不符 - 赋值逻辑错误:每次循环都重新把
df1赋值为单元素列表,最终只会保留最后一次循环的计算值,得不到全表结果
内容的提问来源于stack exchange,提问作者barney stinson
相关产品推荐
相关产品推荐

