我想找出在特定行之前和之后的行之间的差异。具体来说,我有以下数据集:
Number of rows A
1 4
2 2
3 2
4 3
5 2 我应该得到以下数据:
Number of rows A B
1 4 NaN (since there is not row before this row)
2 2 2 (4-2)
3 2 -1 (2-3)
4 3 0 (2-2)
5 2 NaN (since there is not row after this row)如您所见,B列中的每一行等于A列中前一行与下一行之间的差--例如,B列中的第二行,等于A列第一行的值与A列中的第三行的值之间的差额。我应该找到前2行和后面2行的区别。我的意思是B列中的第23行中的值等于A列中第21行中的值与A列中第25行中的值之间的差额,我使用前面和下面的行来简化操作。我希望我能解释清楚。
发布于 2018-08-22 14:16:23
似乎您需要一个居中的rolling窗口。您可以使用arg center=True指定
>>> df.A.rolling(3, center=True).apply(lambda s: s[0]-s[-1])
0 NaN
1 2.0
2 -1.0
3 0.0
4 NaN
Name: A, dtype: float64这种方法适用于任何窗口。注意,这是一个居中窗口,因此窗口的大小必须是N+N+1 (其中N是回溯行和查找向前行的数目,您可以添加1来计算中间的值)。因此,一般的公式是
window = 2*N + 1如果您需要2行之前和2行之后,那么N = 2。如果您需要5和5,N=5 (和window = 11)等等,则apply lambda保持不变。
发布于 2018-08-22 14:16:43
将系列(即DataFrame列)设为s。
你想:
s.shift(1) - s.shift(-1)发布于 2018-08-22 14:27:18
您需要在要运行计算的列(系列)上使用.shift。
使用shift(1)可以得到前一行,使用shift(-1)可以得到下一行。
从那里你需要计算previous - next
>>> s = pd.Series([4,2,2,3,2])
>>> s
0 4
1 2
2 2
3 3
4 2
dtype: int64
# previous
>>> s.shift(1)
0 NaN
1 4.0
2 2.0
3 2.0
4 3.0
dtype: float64
# next
>>> s.shift(-1)
0 2.0
1 2.0
2 3.0
3 2.0
4 NaN
dtype: float64
# previous - next
>>> s.shift(1)-s.shift(-1)
0 NaN
1 2.0
2 -1.0
3 0.0
4 NaN
dtype: float64https://stackoverflow.com/questions/51968722
复制相似问题