2016-04-13 11 views
0

Ich versuche, eine neue Spalte zu erstellen, die mir die Zählungen gibt, wenn eine bestimmte Gruppe auftritt. Ich tue so etwas wie die folgenden ...Effizientes Zählen gruppierter Elemente in Pandas

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) 

Wenn ich diesen Code ausführen, ist es unannehmbar langsam ist:

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 

Es scheint, dass die meiste Zeit in schriftlicher Form, um die neuen Daten ausgegeben innerhalb der Tabelle. Gibt es vielleicht einen schnelleren Weg, dies zu erreichen? Ich glaube, dass es ein Weg, dies zu tun, schneller, weil dies wirklich so eine fundamentale Operation ist ...

Antwort

2

Wenn ich das richtig verstanden, was Sie wollen, können Sie transform verwenden:

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

wow, das ist mehrmals schneller. Vielen Dank! – ssm

+0

Ich dachte schon, aber ich wollte die Tests machen. Bitte. – ayhan

+1

Sehr schöne Lösung. :) – jezrael

Verwandte Themen