2014-06-26 77 views
0

我需要在時間t計算DataFrame中的一個值,它涉及時間t和t-1的值。在直的Python,我會壓縮在一起的兩個長度爲n-1的列表的fraagments,像這樣:如何執行涉及多行數值的計算?

>>> x = [random.random() for _ in range(10)] 
>>> x 
[0.09154030286701986, 0.7695293091436095, 0.003169617773302602, 0.18746852585939167, 0.16382872408720617, 0.951061080433954, 0.2880246300316386, 0.2585431567171105, 0.40819533123361884, 0.9482919441157496] 
>>> [(a - b) for (a, b) in zip(x[:-1], x[1:])] 
[-0.6779890062765896, 0.7663596913703069, -0.18429890808608906, 0.023639801772185498, -0.7872323563467478, 0.6630364504023154, 0.029481473314528106, -0.14965217451650836, -0.5400966128821307] 

然後處理該邊緣適當情況下。

有沒有類似的習語用DataFrames?

讓我補充一點,這個明顯的(對我來說)模擬沒有做什麼,我會期待它:

In [321]: x 
Out[321]: 
     r1  r2 
0 -1.059815 -1.159293 
1 2.393336 0.458090 
2 0.055295 1.389807 
3 -0.102741 -0.126111 
4 1.242702 -1.846763 
5 -0.115352 -0.051099 
6 -1.676272 1.117046 
7 -0.404109 0.139790 

In [322]: x["r1"][:-1] - x["r2"][1:] 
Out[322]: 
0   NaN 
1 1.935245 
2 -1.334512 
3 0.023370 
4 3.089465 
5 -0.064253 
6 -2.793318 
7   NaN 
dtype: float64 

我預期的-1.059815結果 - 0.458090是在第一位置,不是NaN。

In [325]: [a-b for (a, b) in zip(list(x["r1"])[:-1], list(x["r2"])[1:])] 
Out[325]: 
[-1.5179054299355403, 
1.0035286021021981, 
0.1814061862111446, 
1.7440218133011343, 
1.2938016423931689, 
-1.2323982743162547, 
-1.8160616387411936] 

回答

1

看看shift,其名稱意味着將值向上/向下移動索引。

您的方法不起作用,因爲熊貓按索引對齊。因此,當您添加行的子集時,它們將被對齊回到它們開始的位置,因爲索引沒有改變。

In [266]: x['r1'] - x['r2'].shift(-1) 
Out[266]: 
0 -1.517905 
1 1.003529 
2 0.181406 
3 1.744022 
4 1.293801 
5 -1.232398 
6 -1.816062 
7   NaN 
dtype: float64 
+0

很酷,謝謝。與基本的Python數據結構相比,這些對象的API是巨大的,它爲採用創造了相當高的障礙。它看起來像Series實例有214個公共屬性。相比之下,Python列表有9個。 – smontanaro