【问题标题】:Pandas groupby and transform takes longPandas groupby 和 transform 需要很长时间
【发布时间】:2018-09-15 15:33:09
【问题描述】:

给定一个与此类似的DataFrame(但有超过一百万行和大约 140000 个不同的groups)

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的最短时间之间的区别。

我使用groupbytransform 管理它,如下所示:

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

但计算需要将近一分钟。有没有更快/更智能的方法来做到这一点?

【问题讨论】:

  • 进行任何 python 计算都会使您的代码变慢,因为必须在数据的每一行上调用这些函数。

标签: python pandas dataframe group-by


【解决方案1】:

我的建议:在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内置的min吗?如果是这样,我认为这可以通过pandas.pydata.org/pandas-docs/stable/generated/… 加快速度,但我对熊猫还不够熟悉,无法真正了解
  • 很有意义。从 150 秒到 0.5 秒。谢谢!
猜你喜欢
  • 2018-10-16
  • 2015-10-31
  • 1970-01-01
  • 2013-09-07
  • 2020-08-26
  • 2014-10-09
  • 2012-11-26
  • 2019-12-27
  • 2017-10-22
相关资源
最近更新 更多