给定 DataFrame
与此类似(但超过一百万行和大约 140000 个不同的 group
)
df_test = pd.DataFrame({'group': {1:'A', 2:'A', 3:'A', 4:'A', 5:'B', 6:'B'},
'time' : {1:1, 2:3, 3:5, 4:23, 5: 7, 6: 12}})
对于每个 group
我想找出time
之间的区别(这实际上是我真正的 df 中的 dtype('<M8[ns]')
)以及该 group
的最短时间。
我已经使用groupby
来管理它和transform
如下:
df_test['time_since'] = df_test.groupby('group')['time'].transform(lambda d: d - d.min())
正确产生:
group time time_since
1 A 1 0
2 A 3 2
3 A 5 4
4 A 23 22
5 B 7 0
6 B 12 5
但是计算需要将近一分钟。有没有更快/更智能的方法来做到这一点?
最佳答案
我的建议:在transform
之外进行lambda
(计算),所以我们在这里不需要lambda。使用 lambda ,我们多次调用计算(取决于组数)
df_test=pd.concat([df_test]*1000)
%timeit df_test['time']-df_test.groupby('group')['time'].transform(min)
1000 loops, best of 3: 1.11 ms per loop
%timeit df_test.groupby('group')['time'].transform(lambda d: d - d.min())
The slowest run took 7.20 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 2.3 ms per loop
关于python - Pandas groupby 和转换需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49678663/