我想找到特定行之前和之后的行之间的差异。具体来说,我有以下数据集:
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列中的值之差A列中的第三行。重要点:我不需要仅上一个和下一个。我应该找到前2行和后2行之间的区别。我的意思是,B列第23行中的值等于A列第21行中的值与A列第25行中的值之差。为了简单起见,我使用了上一行和下一行。 我希望我能解释一下。
答案 0 :(得分:2)
似乎您需要一个居中 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
(并且窗口= 11)等。 apply lambda保持不变。
答案 1 :(得分:2)
让系列(即DataFrame列)为s
。
您要
s.shift(1) - s.shift(-1)
答案 2 :(得分:1)
您需要在要运行计算的列(系列)上使用.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: float64