【问题标题】:What is an efficient way in pandas to do summaryBy(...,full.dimension=T)什么是 pandas 进行 summaryBy(...,full.dimension=T) 的有效方法
【发布时间】:2012-04-03 23:59:41
【问题描述】:

使用R中的doBy包,我们对组进行汇总,并得到与原始数据相同形状和顺序的结果:

> require(doBy)
> df <- data.frame(
          first = c('bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'),
          second = c('one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'), 
          data = c(-0.424972, 0.567020, 0.276232, -1.087401, -0.673690, 0.113648, -1.478427, 0.524988))
> df
  first second      data
1   bar    one -0.424972
2   bar    two  0.567020*emphasized text*
3   baz    one  0.276232
4   baz    two -1.087401
5   foo    one -0.673690
6   foo    two  0.113648
7   qux    one -1.478427
8   qux    two  0.524988
> df['data.sum'] = summaryBy(data~first, data=df, FUN=sum, full.dimension=T)['data.sum']
> df
  first second      data  data.sum
1   bar    one -0.424972  0.142048
2   bar    two  0.567020  0.142048
3   baz    one  0.276232 -0.811169
4   baz    two -1.087401 -0.811169
5   foo    one -0.673690 -0.560042
6   foo    two  0.113648 -0.560042
7   qux    one -1.478427 -0.953439
8   qux    two  0.524988 -0.953439

DataFrame 按多个索引之一分组时,有没有办法在 pandas 中做同样的事情?

>>> from pandas import DataFrame
>>> df = DataFrame({ 
                 'first': ['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
                 'second': ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'],
                 'data': [-0.424972, 0.567020, 0.276232, -1.087401, -0.673690, 0.113648, -1.478427, 0.524988] })
>>> df = df.set_index(['first', 'second'])
>>> s = df.groupby(level='first')['data'].sum()
>>> df.join(s, on='first', rsuffix='.sum')

KeyError: 'no item named first'

【问题讨论】:

  • 我发现可以用:df['data.sum'] = s.reindex(df.index.get_level_values('first')).values

标签: python r pandas


【解决方案1】:

怎么样:

df['data.sum'] = df.groupby('first')['data'].transform(np.sum)

您还可以将 as_index=False 传递给 groupby 以在聚合时获得更多类似 R 的行为(或在结果上调用 reset_index

【讨论】:

  • 酷!我永远不会知道这个技巧。如果'first'已经是索引之一,我需要使用df['data.sum'] = df.groupby(level='first')['data'].transform(np.sum)。谢谢。
【解决方案2】:

怎么样

from pandas import *
df = DataFrame({ 
    'first': ['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
    'second': ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'],
    'data': [-0.424972, 0.567020, 0.276232, -1.087401, -0.673690, 0.113648, -1.478427, 0.524988] 
})

df2 = df.join(df.groupby("first").sum().rename(columns={"data":"sum_data"}), 
              on="first")

【讨论】:

  • 谢谢,这确实有效。但如果可能的话,我真的很想建立索引。
  • 我认为您收到了 KeyError,因为 df 在加入之前已被编入索引,因此“first”不再是加入“on”的列。解决这个问题,加入后可以设置索引吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多