2017-03-03 4 views
4

Ich habe folgende DF in Pandas:Pandas GROUPBY mit Zahl, sum und avg

+---------+--------+--------------------+ 
| keyword | weight | other keywords | 
+---------+--------+--------------------+ 
| dog  | 0.12 | [cat, horse, pig] | 
| cat  | 0.5 | [dog, pig, camel] | 
| horse | 0.07 | [dog, camel, cat] | 
| dog  | 0.1 | [cat, horse]  | 
| dog  | 0.2 | [cat, horse , pig] | 
| horse | 0.3 | [camel]   | 
+---------+--------+--------------------+ 

Die Aufgabe, die ich ausführen möchte, ist nach Stichwort Gruppierung und gleichzeitig der Keyword-Frequenz zu zählen, im Durchschnitt beträgt und Summieren nach anderen Schlüsselwörtern. Das Ergebnis wäre so ähnlich sein:

+---------+-----------+------------+------------------------------------------------+ 
| keyword | frequency | avg weight |     sum other keywords   | 
+---------+-----------+------------+------------------------------------------------+ 
| dog  |   3 | 0.14  | [cat, horse, pig, cat, horse, cat, horse, pig] | 
| cat  |   1 | 0.5  | [dog, pig, camel]        | 
| horse |   2 | 0.185  | [dog, camel, cat, camel]      | 
+---------+-----------+------------+------------------------------------------------+ 

Nun, ich weiß, wie es in vielen getrennten Vorgängen zu tun: value_counts, groupby.sum(), groupby.avg() und Merging es dann. Es ist jedoch sehr ineffizient und ich muss viele manuelle Anpassungen vornehmen.

Ich frage mich, ob es möglich ist, es in einem Arbeitsgang zu tun?

Antwort

7

können Sie agg verwenden:

df = df.groupby('keyword').agg({'keyword':'size', 'weight':'mean', 'other keywords':'sum'}) 
#set new ordering of columns 
df = df.reindex_axis(['keyword','weight','other keywords'], axis=1) 
#reset index 
df = df.rename_axis(None).reset_index() 
#set new column names 
df.columns = ['keyword','frequency','avg weight','sum other keywords'] 

print (df) 
    keyword frequency avg weight \ 
0  cat   1  0.500 
1  dog   3  0.140 
2 horse   2  0.185 

           sum other keywords 
0        [dog, pig, camel] 
1 [cat, horse, pig, cat, horse, cat, horse, pig] 
2      [dog, camel, cat, camel] 
+0

Nizza wie 'sum' :-) +1 – pansen

+0

@pansen auf Listen auch hier funktioniert - danke. – jezrael

+0

Ich wusste, dass ich etwas falsch gemacht habe! Genau das habe ich gebraucht! Danke vielmals. – pawelty