<p>从您的示例数据开始:</p>
<pre><code>df = pd.DataFrame()
df['I'] = pd.Series([1,-2,8,-10,3,4,5, 10, -20, 3])
df['I_median'] = df['I'].rolling(lookback).median()
df['Values'] = pd.Series([1,2,2,3,0,9,10, 8, 20, 9])
</code></pre>
<p>现在为“Value”列添加移位列</p>
<pre><code># add one column for every lookback
for colno in range(lookback):
# shift the column by one and deduct the median
df['n'+ str(colno)] = df['Values'].shift(colno) - df['I_median']
# remove all negative numbers (where value is smaller than median)
df['n'+ str(colno)] = df['n'+ str(colno)].where(df['n'+ str(colno)]> 0, 0)
# sum up across the new columns
df['result'] = df[df.columns[-lookback:]].sum(axis=1)
</code></pre>
<p>result包含您的结果并等于</p>
<pre><code>0 0.0
1 0.0
2 2.0
3 13.0
4 0.0
5 6.0
6 11.0
7 12.0
8 23.0
9 28.0
Name: result, dtype: float64
</code></pre>
<h2>编辑:数据框中不带移位列</h2>
<pre><code>df['result'] = 0
for colno in range(lookback):
# shift the column by one and deduct the median
df['temp'] = df['Values'].shift(colno) - df['I_median']
# remove all negative numbers (where value is smaller than median)
df['temp'] = df['temp'].where(df['temp']> 0, 0)
# sum up across the new columns
df['result'] = df['result'] + df['temp']
</code></pre>
<h2>演出</h2>
<ul>
<li>数据帧中有1m行</li>
<li>1000回望</li>
</ul>
<pre><code>lookback = 1000
df = pd.DataFrame()
df['I'] = pd.Series(np.random.randint(0, 10, size=1000000))
df['I_median'] = df['I'].rolling(lookback).median()
df['Values'] = pd.Series(np.random.randint(0, 10, size=1000000))
</code></pre>
<p>大约14秒</p>