【问题标题】:Non-aggregate update of `pandas.DataFrame.groupby``pandas.DataFrame.groupby` 的非聚合更新
【发布时间】:2020-08-31 09:56:17
【问题描述】:

考虑按列分组的数据框。

example = pandas.DataFrame({
    'A': numpy.arange(100) // 10,
    'B': numpy.nan
})

现在我希望通过对每个组进行一些计算来更新列。结果是一个系列,而不是像平均值或中位数这样的单个聚合数字。一种解决方案是:

for a, rows in example.groupby('A'):
    # Some update that is performed per group
    some_update = numpy.arange(len(rows))
    # slow:
    example.loc[rows.index, 'B'] = some_update

但是,我注意到 example.loc[...] = ... 语句占用了大部分时间,这很遗憾,尤其是当组是原始 DataFrame 中的连续分区时。

是否可以 groupby 并让行成为原始数据的子集视图,以便将更新传递给原始 DataFrame?

【问题讨论】:

  • 这对你有用吗:pd.concat( [value.assign(B=np.arange(len(value))) for key, value in example.groupby("A")])?
  • example.groupby("A")["B"].cumcount()?
  • @HenryYik 谢谢!所以numpy.arange(...) 只是一个例子,以避免我的问题变得复杂。它可以是更新组的任何内容。在我的例子中,它是来自不同实验的时间序列,其中使用启发式枚举由零信号分隔的天数。
  • @sammywemmy pandas.concat 会不会很慢?
  • @Herbert slowness 将来自 for 循环,不一定来自串联。

标签: python pandas group-by pandas-groupby


【解决方案1】:

您可以尝试使用transform,作为我之前建议的另一种选择:

example.assign(B=example.groupby("A").transform(lambda x: range(len(x))))

【讨论】:

  • 这看起来很优雅,让我看看它是否加快了速度,example.assign 快吗?
  • 速度是相对的。您必须将其与某些东西进行比较。我想相信它比我之前提供的 pandas concat 解决方案更快。 assign 创建一个新的数据框。很想知道速度结果是什么
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 2015-03-13
  • 2020-12-15
  • 1970-01-01
  • 2021-11-04
  • 2018-06-14
  • 1970-01-01
  • 2014-07-04
相关资源
最近更新 更多