【问题标题】:Alternative to pandas groupby with lambda and diff使用 lambda 和 diff 替代 pandas groupby
【发布时间】:2020-11-12 01:11:29
【问题描述】:

假设我在下面有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

这可以使用groupbylambdadiff 来完成:

df.groupby('ID').apply(lambda x: x.diff())

我正在尝试提出一个不依赖于lambda 的解决方案,因为这很快就会变得非常慢。有什么想法吗?

更新

(1) 使用groupbylambdadiff 与(2) 仅使用groupbydiff 之间的性能比较:

1

3.67 ms ± 238 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

2

2.42 ms ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

【问题讨论】:

  • 是什么让你相信它会很慢?
  • 将其应用于大型数据帧的经验。
  • 是什么让你认为 lambda 是我应该说的缓慢的结果?
  • 只是假设,如果有大量的组,这就像应用diff 太多次并降低性能。但你是对的,也许lambda 不是问题所在。你的直觉是什么?
  • groupby + lambda + diff:3.67 ms ± 238 µs per loop (mean ± std. dev. of 7 runs, 100 loops each).。 groupby + diff:2.42 ms ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each).

标签: python pandas dataframe lambda pandas-groupby


【解决方案1】:

好吧,在这种情况下,groupby对象直接支持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,即在第一个轴上,不应该比上面的慢,它基本上是等效的(不像在行上使用.applying)。

【讨论】:

    【解决方案2】:

    使用.agg 并传递diff

     df.groupby('ID')['V'].agg('diff')
    
    0    NaN
    1    1.0
    2    NaN
    3   -1.0
    

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 2023-03-23
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多