<p>另一种解决方案是创建一个透视表,向前填充值,然后将它们映射回原始数据帧。在</p>
<pre><code>df2 = df.pivot(columns='count', values='signal', index='index').ffill()
df['signal'] = [df2.at[i, c]
for i, c in zip(df2.index, df['count'].tolist())]
>>> df
count index signal
0 1 1 1
1 1 2 1
2 1 3 1
3 1 4 -1
4 1 5 -1
5 2 6 NaN
6 2 7 -1
7 2 8 -1
8 3 9 NaN
9 3 10 NaN
10 3 11 NaN
11 4 12 1
12 4 13 1
13 4 14 1
</code></pre>
<p>对于800k行数据,这种方法的有效性取决于“count”中有多少个唯一值。在</p>
<p>与我之前的回答相比:</p>
^{pr2}$
<p>最后,您可以简单地使用<code>groupby</code>,尽管它比前面的方法慢:</p>
<pre><code>df.groupby('count').ffill()
Out[191]:
index signal
0 1 1
1 2 1
2 3 1
3 4 -1
4 5 -1
5 6 NaN
6 7 -1
7 8 -1
8 9 NaN
9 10 NaN
10 11 NaN
11 12 1
12 13 1
13 14 1
%%timeit
df.groupby('count').ffill()
100 loops, best of 3: 3.55 ms per loop
</code></pre>