2012-04-03 60 views
1

在R的doBy包中,我們對組進行彙總,並獲得與原始數據相同形狀和順序的結果:什麼是有效的方式在熊貓做summaryBy(...,full.dimension = T)

> 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由多個指標之一進行分組?

>>> 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' – 2012-04-07 03:44:35

回答

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'已經是索引之一。謝謝。 – 2012-04-08 00:44:58

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

謝謝,這是行不通的。但是,如果可能的話,我真的希望有索引。 – 2012-04-04 01:34:59

+0

我認爲你收到了一個KeyError,因爲''df''在加入之前被索引,因此'first'不再是一個加入「on」的列。爲了解決這個問題,你可以在加入後設置索引嗎? – Garrett 2012-04-04 16:29:39

相關問題