<p>我调用了<code>dfa</code>原始数据帧。首先在<code>dfb</code>中创建以后<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge_asof.html" rel="nofollow noreferrer">^{<cd3>}</a>所需的数据</p>
<pre><code>k = 2 # should work for any number
dfb = dfa.copy()
dfb = dfb.sort_values(['date','size']) #actually need in dfa too
# get the k-mean
dfb['avg_price'] = dfb.groupby('date').price.rolling(k).mean().values
#to look for the k nearest sizes in merge_asof
dfb['size'] = dfb.groupby('date')['size'].rolling(k).mean().values
# add one business day to shift all the date
dfb['date'] = dfb['date'] + pd.tseries.offsets.BDay()
dfb = dfb.dropna().drop('price',1)
dfb['size'] = dfb['size'].astype(int) #needed for the merge_asof
print (dfb)
date size avg_price
1 2018-08-02 105 232.5
2 2018-08-02 117 247.5
4 2018-08-03 115 220.0
5 2018-08-03 135 245.0
</code></pre>
<p>您可以使用<code>merge_asof</code>,通过<code>date</code>和<code>nearest size</code>(使用该方法需要<code>sort_values</code>):</p>
^{pr2}$
<p>结果是<code>dfa</code>:</p>
<pre><code> date price size avg_price
0 2018-08-01 220 100 NaN
1 2018-08-01 245 110 NaN
2 2018-08-01 250 125 NaN
3 2018-08-02 210 110 232.5
4 2018-08-02 230 120 247.5
5 2018-08-02 260 150 247.5
6 2018-08-03 200 115 220.0
</code></pre>