如何在Python Pandas中无需循环计算每行Open与上一行Close的差值?
实现无循环计算Pandas DataFrame的Gap列
首先是你的原始DataFrame定义:
import pandas as pd data = {'Open': [7099,7089.3,7097.55,7365,7429, 7486.05], 'high': [7150,7169,7278.2,7410,7500,7520], 'low' : [7060,6884.85,7092.25,7344.15,7407,7443], 'close': [7104,7058.4,7269.1,7398.3,7489.45,7505.45]} df1 = pd.DataFrame(data)
完全可以用Pandas内置的矢量化操作实现,不需要循环,核心是用shift()方法将close列整体下移一行,再和Open列做减法:
# 新增gap列:当前行Open - 上一行close df1['gap'] = df1['Open'] - df1['close'].shift(1)
执行后得到的df1结果如下:
| Open | high | low | close | gap |
|---|---|---|---|---|
| 7099.0 | 7150.0 | 7060.00 | 7104.00 | NaN |
| 7089.3 | 7169.0 | 6884.85 | 7058.40 | -14.70 |
| 7097.55 | 7278.2 | 7092.25 | 7269.10 | 39.15 |
| 7365.0 | 7410.0 | 7344.15 | 7398.30 | 95.90 |
| 7429.0 | 7500.0 | 7407.00 | 7489.45 | 30.70 |
| 7486.05 | 7520.0 | 7443.00 | 7505.45 | -3.40 |
关键说明
df1['close'].shift(1)会把close列的所有元素向下移动一行,第一行变为NaN(因为没有上一行数据),这和Excel中跨行引用的逻辑完全对应- 整个操作是矢量化的,底层由Pandas/NumPy优化,效率远高于循环,和
np.where()的无循环思路一致
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

