2017-01-31 18 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

pandasmap

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 
相關問題