擅长:python、mysql、java
<p>在您提到的例子中,您将使用<code>diff</code>。例如:</p>
<pre><code>import pandas as pd
df = pd.DataFrame({'data':[123, 312, 432, 32, 54, 67]})
df['new'] = df['data'].diff() / df['data']
</code></pre>
<p>由此产生:</p>
<pre><code> data new
0 123 NaN
1 312 0.605769
2 432 0.277778
3 32 -12.500000
4 54 0.407407
5 67 0.194030
</code></pre>
<p>不过,一般来说,这些类型的东西都是矢量化技巧。移动和切片非常有用。例如,假设我们想要</p>
<pre><code>(data[i] + data[i+1]) / data[i]
</code></pre>
<p>如果您熟悉numpy数组,您可能会尝试:</p>
<pre><code>df['new'] = (df['data'][:-1] + df['data'][1:]) / df['data']
</code></pre>
<p>由于<code>pandas</code>处理自动对齐的方式,此结果将与我们之前的结果略有不同:</p>
<pre><code> data new
0 123 NaN
1 312 2
2 432 2
3 32 2
4 54 2
5 67 NaN
</code></pre>
<p>因此,对于<code>pandas</code>,最好显式地移动序列,而不是使用切片,在这种情况下:</p>
<pre><code>df['new'] = (df['data'].shift(1) + df['data']) / df['data'].astype(float)
</code></pre>
<p>这将产生:</p>
<pre><code> data new
0 123 NaN
1 312 1.394231
2 432 1.722222
3 32 14.500000
4 54 1.592593
5 67 1.805970
</code></pre>