2017-03-03 5 views
4

でGROUPBY:パンダは、私はパンダで、次のDFを持っている数、合計や平均

+---------+--------+--------------------+ 
| 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]   | 
+---------+--------+--------------------+ 

私が実行するタスクは、キーワードによってグループ化すると同時に、キーワードの頻度を数え、重量平均と合算されます他のキーワードで

+---------+-----------+------------+------------------------------------------------+ 
| 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]      | 
+---------+-----------+------------+------------------------------------------------+ 

は今、私は多くの別々の操作でそれを行う方法を知っている:value_counts、groupby.sum()、groupby.avg()し、それをマージした結果は、そのようなものになるだろう。しかし、それは非常に非効率的で、私は多くの手動調整が必要です。

私はそれが1回の操作で行うことができますか?

答えて

7

あなたはaggを使用することができます。

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

'sum'は1 – pansen

+0

@pansen :-)ここにもリストにどのように動作するかニース - ありがとうございました。 – jezrael

+0

私は何かが間違っていることを知っていた!これはまさに私が必要としていたものです!どうもありがとう。 – pawelty

関連する問題