Python 指定行上的.diff()

Python 指定行上的.diff(),python,pandas,dataframe,Python,Pandas,Dataframe,我见过许多类似的问题,但没有一个能解决我的问题 我有一个非常大的数据集,我只想找到与前一行的几个选定行的差异。在下面的示例中,我希望根据calc中的值在pVal上获取diff(),如下所示: pVal calc pDiff 1 .17 False NaN 2 .31 False NaN 3 .46 False NaN 4 .39 Tru

我见过许多类似的问题,但没有一个能解决我的问题

我有一个非常大的数据集,我只想找到与前一行的几个选定行的差异。在下面的示例中,我希望根据calc中的值在pVal上获取diff(),如下所示:

     pVal        calc        pDiff
1    .17         False       NaN
2    .31         False       NaN
3    .46         False       NaN
4    .39         True       -.07
5    .26         False       NaN
6    .6          True       .34
注意:pDiff默认获取NaN

可以简单地计算所有行的差异,然后在“calc”下用NaN替换pDiff,而不是False。但如前所述,我有一个非常大的数据集,在calc列中只有很少的“真”值,因此开销很大

我尝试了以下方法:

df['pDiff'] = df[df['calc']==True]['pVal'].diff()
但它给出了不正确的结果,用calc==True计算行之间的差异。在我们的示例中,第6行的差异是在第6行和第4行之间计算的(0.6-0.39=0.21),而不是在第6行和第5行之间预期的0.34。第4行的差异仍然是NaN,它是calc==True的第一行

我可以选择遍历所有行,但这对我来说太慢了

我需要一个只计算和更改calc包含True的行的值的解决方案

试试看

df['shifted'] = df.calc.shift()
df1 = df[(df.calc == True) | (df.shifted == True)]
df1.pdidff = df1.pVal.diff()
试试看


np.其中
+
shift
非常适合根据条件进行上一行或下一行比较:)


np.其中
+
shift
非常适合根据条件进行上一行或下一行比较:)


运行:
df['pDiff']=np.where(df.calc,df.pVal.diff(),np.nan)

df.pVal.diff()。

df.calc
是条件,
np.nan
是“其他”值。

运行:
df['pDiff']=np.where(df.calc,df.pVal.diff(),np.nan)

df.pVal.diff()。
df.calc
是条件,
np.nan
是“其他”值

df['pDiff'] = np.where((df['calc'] == True), df['pVal'] - df['pVal'].shift(), np.nan)