<p>.loc速度慢,应用速度慢。
在我看来,使用向量化函数和列上的操作,无需逐行应用和loc查找,就可以实现所需的功能</p>
<p>如果没有@Manakin建议的真实数据示例,很难判断。
但是我试着用一个例子来重新创建你的问题,并根据你的描述来解决它</p>
<pre><code># lookback window
lookback = 3
# Fixed Index
I = [5, 2, 1, 4, 2, 4, 1, 2, 1, 10]
# Dataframe with value column, Index added as column for convenience
df = pd.DataFrame({'I': I,
'value':[6,5,4,3,2,1, 2, 3, 4, 5]},
index=I)
# Median over lookback window
df['I_median'] = df.I.rolling(lookback).median()
</code></pre>
<p>屈服</p>
<pre><code>| | I | value | I_median
| | -| | |
| 5 | 5 | 6 | NaN |
| 2 | 2 | 5 | NaN |
| 1 | 1 | 4 | 2.0 |
| 4 | 4 | 3 | 2.0 |
| 2 | 2 | 2 | 2.0 |
| 4 | 4 | 1 | 4.0 |
| 1 | 1 | 2 | 2.0 |
| 2 | 2 | 3 | 2.0 |
| 1 | 1 | 4 | 1.0 |
| 10 | 10 | 5 | 2.0 |
# Check if Index is greater than median
df['I_gt'] = df.I > df.I_median
# set all rows to 0 where median is greater than index
df['filtered_val'] = df.value.where(df.I_gt, 0)
| | I | value | I_median | I_gt | filtered_val |
| | | -| | -| |
| 5 | 5 | 6 | NaN | False | 0 |
| 2 | 2 | 5 | NaN | False | 0 |
| 1 | 1 | 4 | 2.0 | False | 0 |
| 4 | 4 | 3 | 2.0 | True | 3 |
| 2 | 2 | 2 | 2.0 | False | 0 |
| 4 | 4 | 1 | 4.0 | False | 0 |
| 1 | 1 | 2 | 2.0 | False | 0 |
| 2 | 2 | 3 | 2.0 | False | 0 |
| 1 | 1 | 4 | 1.0 | False | 0 |
| 10 | 10 | 5 | 2.0 | True | 5 |
</code></pre>
<p>然后简单地对过滤后的列进行滚动求和</p>
<pre><code>df.filtered_val.rolling(lookback).sum()
</code></pre>