如何执行涉及多行值的计算?

时间:2014-06-26 16:28:56

标签: python pandas

我需要在时间t计算DataFrame中的值,该值涉及时间t和t-1的值。在直接的Python中,我会将列表的两个长度为n-1的片段压缩在一起,如下所示:

>>> 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 个答案:

答案 0 :(得分:1)

看一下shift,顾名思义就是在索引上下移动值。

您的方法不起作用,因为pandas按索引排列。因此,当您添加行的子集时,它们将对齐回到它们开始的位置,因为索引不会更改。

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