【问题标题】:Computing averages from two dataframes从两个数据帧计算平均值
【发布时间】:2022-01-06 18:13:51
【问题描述】:

一个数据框如下所示(这些只是小样本):

user    item     rating
u1      i1       0
u1      i2       1
u1      i3       1
u2      i2       1
u2      i3       0
u2      i4       0
u2      i5       0
u3      i6       1
u3      i7       1
u4      i4       1
u4      i7       0

还有一个是这样的:

item     property_1    ...   property_n    grade
i1       0.60                1             Bad
i2       0.90                1             Good
i3       0.90                0             Good
i4       0.75                1             Bad

可能有项目在第一个数据帧中,而不是在第二个数据帧中,反之亦然。

我想知道的是,糟糕的项目是否真的被评为很差,以及好的项目是否真的被评为很好。我知道我可以得到平均的item 评级,例如这个:

df.groupby(['item'])['rating'].mean()

如果我为user 这样做,我会得到该用户给出的平均评分。

但我怎样才能构建如下所示的数据框?

item      average_rating      grade
i1                    0         Bad
i2                    1        Good
i3                  0.5        Good
i4                  0.5         Bad

一个额外的问题:我怎样才能合并关于用户的信息? (也许一个用户给了很多 0 评论,但你不能责怪他们,因为这些项目也被认为是糟糕的,但是另一个用户对被认为是好的项目给出了很多糟糕的评论)。但并非所有项目都在第二个数据框中,我们不知道用户的评论是否与评分一致(也许他们对 5 个坏项目的评价很好,对 5 个很好的项目评价很差)。所以我会改为将项目等级转换为01

user       reviews_given           item_grades       consistency
u1               [0,1,1]               [0,1,1]              1.00
u80            [0,1,0,1]             [1,0,1,0]              0.00

这样的列表会起作用吗?怎么可能做到这一点?

【问题讨论】:

标签: python pandas dataframe mean


【解决方案1】:

对于第一个问题:您可以使用df.merge() 对两个表进行合并(如 SQL 连接)。

df_group = df.groupby(['item']).mean() # notice i don't have the ['rating'] piece in here. that makes this a series, but we want a dataframe to do the merge
df_group.merge(df2[['item','grade']],on='item') # i just pull from df2 the two columns that I need
    item    rating  grade
0   i1      0.0     Bad
1   i2      1.0     Good
2   i3      0.5     Good
3   i4      0.5     Bad

【讨论】:

    【解决方案2】:

    对于第二个问题:你也可以使用merge,加上一些其他的东西。

    下面我认为df 是您发布的第一个表格,df2 是您发布的第二个表格。

    df3 = df.merge(df2[['item','grade']],on='item') # similar to above, but we haven't grouped yet and still have user
    df3['grade'] = df3['grade'].map({'Bad':0,'Good':1}) # convert grades to numbers
    df3['match?'] = (df3['rating'] == df3['grade']).map({True:1,False:0}) # new column that returns 1 if the rating and grade match, 0 if don't match
    df4 = df3.groupby('user').agg({'rating':list,'grade':list,'match?':list,'match?':'mean'}) # a new dataframe that groups the last one but groups a few columns into lists and also gets a mean of matches
    df4
             rating      grade    match?
    user
    u1    [0, 1, 1]  [0, 1, 1]  1.000000
    u2    [1, 0, 0]  [1, 1, 0]  0.666667
    u4          [1]        [0]  0.000000
    >>>
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2017-08-31
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多