2017-01-31 4 views
2

Я немного застрял в попытке нормализовать некоторые записи столбца в кадре данных pandas. Так что у меня dataframe так:Нормализовать столбец в dataframe pandas суммой сгруппированных значений другого столбца

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 
Смежные вопросы