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回路)
。