Python lambda和diff可替代熊猫groupby

Python lambda和diff可替代熊猫groupby,python,pandas,dataframe,lambda,pandas-groupby,Python,Pandas,Dataframe,Lambda,Pandas Groupby,假设我有以下df: ID V 0 A 1 1 A 2 2 B 4 3 B 3 所需输出为: V 0 NaN 1 1.0 2 NaN 3 -1.0 这可以使用groupby和lambda以及diff来完成: df.groupby('ID').apply(lambda x: x.diff()) >>> df ID V 0 A 1 1 A 2 2 B 4 3 B 3 >>>

假设我有以下
df

    ID  V
0   A   1
1   A   2
2   B   4
3   B   3
所需输出为:

    V
0   NaN
1   1.0
2   NaN
3   -1.0
这可以使用
groupby
lambda
以及
diff
来完成:

df.groupby('ID').apply(lambda x: x.diff())
>>> df
  ID  V
0  A  1
1  A  2
2  B  4
3  B  3
>>> df.groupby('ID').diff()
     V
0  NaN
1  1.0
2  NaN
3 -1.0
>>>
我正试图想出一个不依赖于
lambda
的解决方案,因为这很快就会变得非常缓慢。有什么想法吗

更新

(1)使用
groupby
lambda
diff
,以及(2)仅使用
groupby
diff
之间的性能比较:

df.groupby('ID').apply(lambda x: x.diff())
>>> df
  ID  V
0  A  1
1  A  2
2  B  4
3  B  3
>>> df.groupby('ID').diff()
     V
0  NaN
1  1.0
2  NaN
3 -1.0
>>>
一,

二,


使用
.agg
并传递
diff

 df.groupby('ID')['V'].agg('diff')

0    NaN
1    1.0
2    NaN
3   -1.0

使用
.agg
并传递
diff

 df.groupby('ID')['V'].agg('diff')

0    NaN
1    1.0
2    NaN
3   -1.0

在这种情况下,groupby对象直接支持
diff

df.groupby('ID').apply(lambda x: x.diff())
>>> df
  ID  V
0  A  1
1  A  2
2  B  4
3  B  3
>>> df.groupby('ID').diff()
     V
0  NaN
1  1.0
2  NaN
3 -1.0
>>>

但我不确定这是否真的能提高你的表现。在列上使用
.apply
,即在第一个轴上,不应该比上面慢,它基本上是等效的(与在行上使用
.apply
不同)。

在这种情况下,groupby对象直接支持
diff

df.groupby('ID').apply(lambda x: x.diff())
>>> df
  ID  V
0  A  1
1  A  2
2  B  4
3  B  3
>>> df.groupby('ID').diff()
     V
0  NaN
1  1.0
2  NaN
3 -1.0
>>>

但我不确定这是否真的能提高你的表现。在列上使用
.apply
,即在第一个轴上,不应比上面的慢,它基本上是等效的(与在行上使用
.apply
不同).

是什么让你相信它会很慢?在大数据帧上应用它的经验。是什么让你认为lambda是我应该说的慢的结果?只是假设,对于大量的组,这就像应用
diff
太多次,降低了性能。但你是对的,也许问题不在lambda。你的直觉是什么?groupby+lambda+diff:
3.67 ms±238µs/圈(平均±标准偏差7次,每个循环100次)。
。groupby+diff:
2.42 ms±20.4µs/循环(平均±标准偏差为7次运行,每个循环100次)
。是什么让你相信它会很慢?在大数据帧上应用它的经验。是什么让你认为lambda是我应该说的缓慢的结果?只是假设,对于大量的组,这就好比多次应用
diff
会降低性能。但你是对的,也许问题不在lambda。你的直觉是什么?groupby+lambda+diff:
3.67 ms±238µs/圈(平均±标准偏差7次,每个循环100次)。
。groupby+diff:
2.42 ms±20.4µs/回路(7次运行的平均值±标准偏差,每个100回路)