2017-01-31 10 views
2

私は、パンダのデータフレームの列のいくつかのエントリを正規化しようとしています。私は、各項目の数は、各ユーザが購入し、合計することによって正規化された買って取得したいと思い他の列のグループ化された値の合計で、パンダのデータフレームの列を正規化します。

df = pd.DataFrame({ 
     'user':[0,0,1,1,1,2,2], 
     'item':['A','B', 'A', 'B','C','B','C'], 
     'bought':[1,1,1,3,3,2,3]}) 
df 
bought|item|user 
---------------- 
1  |A |0 
1  |B |0 
1  |A |1 
3  |B |1 
3  |C |1 
2  |B |2 
3  |C |2 

:だから私はこのようなデータフレームを持っています。

つまり、「購入済み」の各エントリについて、そのユーザー(別の列)として購入した合計金額で除算したいと考えています。この場合、私がしたい出力がこれです(ただし、「正規化」列には、画分である必要はありません):

bought|item|user|normalized 
-------------------------- 
1  |A |0 |1/2 
1  |B |0 |1/2 
1  |A |1 |1/7 
3  |B |1 |3/7 
3  |C |1 |3/7 
2  |B |2 |2/5 
3  |C |2 |3/5 

は、これまでのところ私は、ユーザーごとにグループ化され、ユーザによって合計を得ている:

grouped = df.groupby(by='user') 
grouped.aggregate(np.sum) 

しかし、この時点で私は立ち往生しています。ありがとう!

答えて

3
map

pandas

df.assign(normalized=df.bought.div(df.user.map(df.groupby('user').bought.sum()))) 

pandastransform

df.assign(normalized=df.bought.div(df.groupby('user').bought.transform('sum'))) 

両方

bought item user normalized 
0  1 A  0 0.500000 
1  1 B  0 0.500000 
2  1 A  1 0.142857 
3  3 B  1 0.428571 
4  3 C  1 0.428571 
5  2 B  2 0.400000 
6  3 C  2 0.600000 
を得
関連する問題