如何在Pandas中从第二行开始计算index_100列值
问题说明
我需要处理一个DataFrame:
- 要求跳过
index_100列值为100的第0行,从第1行开始计算index_100,计算过程必须用到第0行的原始数据。 - 之前我用的是从第2行开始计算的代码:
df['index_100'] = ((df['index_100']).shift(1))*(df['close'])/(df['prev_close'])
- 我的原始数据如下:
symbol timestamp close index_100 prev_close 0 BTCUSDT 1665187200000 19537.11 100 NaN 1 BTCUSDT 1665187500000 19559.57 100 19537.11 2 BTCUSDT 1665187800000 19561.30 100 19559.57 3 BTCUSDT 1665188100000 19568.50 100 19561.30 4 BTCUSDT 1665188400000 19608.70 100 19568.50 5 BTCUSDT 1665188700000 19593.45 100 19608.70
- 想要得到的计算结果是:
symbol timestamp close index_100 prev_close 0 BTCUSDT 1665187200000 19537.11 100 NaN 1 BTCUSDT 1665187500000 19559.57 100.1149607081 19537.11 2 BTCUSDT 1665187800000 19561.30 100.1238156513100 19559.57 3 BTCUSDT 1665188100000 19568.50 100.1606685943 19561.30 4 BTCUSDT 1665188400000 19608.70 100.366430859 19568.50 5 BTCUSDT 1665188700000 19593.45 100.2883742785 19608.70
解决代码
直接指定从第1行开始替换计算值,保留第0行的原始100:
# 对第1行及以后的index_100进行计算赋值 df.loc[1:, 'index_100'] = df['index_100'].shift(1)[1:] * df['close'][1:] / df['prev_close'][1:]
或者用mask方法更简洁:
# 先算出所有行的计算结果 calc_result = df['index_100'].shift(1) * df['close'] / df['prev_close'] # 把第1行及以后的原始值替换成计算结果,第0行保持不变 df['index_100'] = df['index_100'].mask(df.index >= 1, calc_result)
这两种方法都能得到你要的结果:第0行保留初始的100,第1行用第0行的100乘以当前close除以prev_close,后续每一行都用上一行计算好的index_100值继续迭代计算。
内容的提问来源于stack exchange,提问作者One boy
相关产品推荐
相关产品推荐

