2012-04-03 5 views
1

RのdoByパッケージでは、グループのサマリーを作成し、元のデータと同じ形状と順序で結果を取得します。 DataFrameが複数の指標の一つでグループ化されている summaryandBy(...、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 

パンダで同じことをする方法はあり

、?

>>> 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' –

答えて

2

方法について:また、集約するときよりRのような振る舞いを取得(または結果にreset_indexを呼び出す)するGROUPBYするas_index=Falseを渡すことができ

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

+0

クール!私はこのトリックを知らなかっただろう。 'first'がすでにインデックスの1つである場合、 'df ['data.sum'] = df.groupby(level = 'first')['data']。transform(np.sum)'を使用する必要があります。ありがとう。 –

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

あなたが参加する前に '' df''が索引付けされていたため、 'first'はもはや "on"に参加する列ではなかったので、KeyErrorを受け取ったと思います。これを解決するには、参加後にインデックスを設定できますか? – Garrett

関連する問題