使用计算值替换多索引数据框列中的值

时间:2015-09-29 17:47:26

标签: python replace dataframe calculated-columns

我想对一组值进行高斯归一化(按业务排名和评论者等级进行归一化)。这是代码:

import pandas as pd
import numpy as np

columns = ['user_id','business_id', 'stars']
data = {'user_id': ['u1', 'u1', 'u2', 'u1', 'u2', 'u2', 'u2', 'u1'],
    'business_id': ['r1', 'r2', 'r2', 'r2', 'r1', 'r2', 'r1', 'r1'],
    'stars': [5.0, 3.0, 2.0, 4.0, 1.0, 5.0, 2.0, 4.0],
    }
df = pd.DataFrame(data, columns=columns)

userList = set(df.user_id)
busList = set(df.business_id)


for user_id in userList:
    # average rating given by the user
    avg_user = df[df.user_id == user_id].stars.mean()
    sum = 0.0  
    for bus_id in busList:

        sum += (df[(df.user_id == user_id) & (df.business_id == bus_id)].stars.values - avg_user)**2

    for bus_id2 in busList:

        rating = (df[(df.user_id == user_id) & (df.business_id == bus_id2)].stars.values - avg_user) / sum

        df[(df.user_id == user_id) & (df.business_id == bus_id2)].stars = rating

busList - 是一个业务ID列表 userList - 用户ID列表

  1. 我觉得我有太多的循环,但我无法找到减少数量的方法。需要建议

  2. 我的最后一行代码,我将替换列中的值" stars"计算值"评级"看起来很笨重。有什么建议吗?

  3. 当我在每个周期后打印总和时,我对我的结果很奇怪:

    [2. 0.] - 对于u1(这两个数字的总和)必须为2.0

    [2.5 6.5] - 对于u2(这两个数字的总和)必须为9

  4. 我觉得代码很笨,我做错了

    谢谢!

0 个答案:

没有答案