2016-04-13 12 views
0

特定のグループが発生したときにカウントを与える新しい列を作成しようとしています。パンダのグループ化された要素を効率的にカウントする

In [7]: run test 
    A B C counts-A-B 
0 1 1 1   3 
1 1 1 2   3 
2 1 1 4   3 
3 2 1 3   2 
4 2 1 5   2 

In [8]: %timeit for _ in xrange(5): appendCnt1(df, factors) 
1 loops, best of 3: 225 ms per loop 

ほとんどの時間は、新しいデータを書き込むことに費やされていることが表示されます:私は...

import pandas as pd 

table = '''A B C 
1 1 1 
1 1 2 
1 1 4 
2 1 3 
2 1 5''' 

df = pd.DataFrame([t.split(' ') for t in table.split('\n')[1:]], 
     columns=table.split('\n')[0].split(' ')) 

def appendCnt(df, factors): 
    f = 'counts-'+ '-'.join(factors) 
    df[f] = 0 
    for k, v in df.groupby(factors): 
     df[f].ix[v.index] = len(v) 
    return df 

factors = ['A', 'B'] 
print appendCnt(df, factors) 

私はこのコードを実行すると、それが許容できないほど遅いですが、以下のようなものをやっていますテーブル内でおそらくこれを達成するより速い方法はありますか?私はあなたが欲しいものを正確に理解している場合、あなたはtransformを使用することができます

答えて

2

...これは本当に、このような基本的な動作であるため、より速くこれを行う方法がなければならないと感じて:

df['counts-'+ '-'.join(factors)] = df.groupby(factors).transform("count") 

df 
Out[6]: 
    A B C counts-A-B 
0 1 1 1   3 
1 1 1 2   3 
2 1 1 4   3 
3 2 1 3   2 
4 2 1 5   2 
+0

うわー、これは何倍も高速です。ありがとう! – ssm

+0

私はそう思っていましたが、私は試験をしようとしていました。どういたしまして。 – ayhan

+1

非常に良い解決策。 :) – jezrael

関連する問題