С пакетом 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'
Как насчет:
df['data.sum'] = df.groupby('first')['data'].transform(np.sum)
Вы также можете передать as_index=False
для groupby, чтобы получить больше R-подобных действий при агрегировании (или вызвать reset_index
на результат)
df['data.sum'] = df.groupby(level='first')['data'].transform(np.sum)
если 'first' уже является одним из индексов. Благодарю.
Как насчет
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")
df
был проиндексирован до присоединения, поэтому «first» больше не был столбцом для присоединения «on». Чтобы решить эту проблему, вы можете установить индекс после присоединения?
df['data.sum'] = s.reindex(df.index.get_level_values('first')).values