Python 基于另一列计算行之间的差值

Python 基于另一列计算行之间的差值,python,pandas,numpy,Python,Pandas,Numpy,我想使用python/pandas基于某个列计算行之间的差异。我想我可以用小例子更好地解释。因此,我有以下数据: Number of rows A B 1 4 NaN 2 2 NaN 3 2 1 4 3 N

我想使用python/pandas基于某个列计算行之间的差异。我想我可以用小例子更好地解释。因此,我有以下数据:

 Number of rows       A             B
 1                    4             NaN
 2                    2             NaN
 3                    2             1
 4                    3             NaN
 5                    2             NaN
 Number of rows      A            B           C
 3                   2            1           2
我想得到以下数据:

 Number of rows       A             B
 1                    4             NaN
 2                    2             NaN
 3                    2             1
 4                    3             NaN
 5                    2             NaN
 Number of rows      A            B           C
 3                   2            1           2
那么,让我来解释一下我在这里做了什么。首先,我需要识别列B的行,它的值为1(正如您可以看到第3行的值为1)。然后,我需要找到这一行之前和之后的两行(第3行)之间的差异,并将结果显示为C列。在我们的示例中,第3行之前的两行是第1行,第3行之后的两行是第5行。列A的第1行和第5行的值之间的差值是2(4-2=2)(最后,我将保留C列中的行只有值-这是一项简单的任务,我不需要任何帮助)。 我希望我能解释一下。
提前感谢你的帮助

一种解决方案是获取索引并使用
i-2
i+2

i = df.loc[df.B.eq(1)].index.tolist()
j = [(i_-2,i_+2) for i_ in i ]

df.loc[df.B.eq(1), 'C'] = [df.A.iloc[a] - df.A.iloc[b] for (a,b) in j]

n   A   B   C
0   1   4   NaN NaN
1   2   2   NaN NaN
2   3   2   1.0 2.0
3   4   3   NaN NaN
4   5   2   NaN NaN
或者,课程可以在
b=1
中再次切片,以获得预期的输出

df[df.B.eq(1)]
    n   A   B   C
2   3   2   1.0 2.0

拉斐尔,再次感谢你的解决。我们如何修改它以无条件使用。我的意思是假设我们没有列B。只需要找到所有行之前和之后两行之间的差异。再次感谢。@Khalid但您希望输出结果如何?因为这将产生一个全新的行,如果我理解正确的话,问题是,我确实有1000多行。因此,在这种情况下,我将有一个列名C。该列中的每一行(让sat第31行)将等于该行之前的两行(第29行)和之后的两行(第33行)之间的差值。@khalid但两行之间的差值将产生一个新行。例如,如果第29行有
(2,3,10,9)
,第31行有
(1,1,8,2)
,则结果将是
(1,2,2,7)
。如何将
(1,2,2,7)
放入C列的单元格中?每行中我只有一个值。例如,我在第29行有12个,在第33行有3个。然后,第31行C列中的单元格将为9。这与主要问题的唯一区别是,我现在没有条件。我的意思是我没有列名B。