Какой эффективный способ в пандах сделать summaryBy (…, full.dimension = T)

1

С пакетом doBy в R мы делаем сводку по группе и получаем результаты в той же форме и порядке, что и исходные данные:

> 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, когда DataFrame сгруппирован одним из нескольких индексов?

>>> 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'
  • 0
    Я понял, что это можно сделать с помощью: df['data.sum'] = s.reindex(df.index.get_level_values('first')).values
Теги:
pandas

2 ответа

2
Лучший ответ

Как насчет:

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

Вы также можете передать as_index=False для groupby, чтобы получить больше R-подобных действий при агрегировании (или вызвать reset_index на результат)

  • 0
    Здорово! Я никогда бы не узнал этот трюк. Мне нужно использовать df['data.sum'] = df.groupby(level='first')['data'].transform(np.sum) если 'first' уже является одним из индексов. Благодарю.
0

Как насчет

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")
  • 0
    Спасибо, это работает. Но я действительно хочу иметь индекс, если это вообще возможно.
  • 0
    Я думаю, что вы получили KeyError, потому что df был проиндексирован до присоединения, поэтому «first» больше не был столбцом для присоединения «on». Чтобы решить эту проблему, вы можете установить индекс после присоединения?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню