【问题标题】:pandas, subtract dataframe from another, when column match熊猫,当列匹配时,从另一个中减去数据框
【发布时间】:2019-08-07 11:06:23
【问题描述】:

我有一个数据框(movielens 数据集)

(Pdb) self.data_train.head()
       userId  movieId  rating   timestamp
65414     466      608     4.0   945139883
79720     547     6218     4.0  1089518106
63354     457     4007     3.5  1471383787
29923     213    59333     2.5  1462636955
63651     457   102194     2.5  1471383710

我找到了每个用户评分的平均值

 user_mean = self.data_train['rating'].groupby(self.data_train['userId']).mean()
(Pdb) user_mean.head()
userId
1    2.527778
2    3.426471
3    3.588889
4    4.363158
5    3.908602

我想从匹配用户的第一个数据帧中减去这个平均值。

有没有办法在没有明确的 for 循环的情况下做到这一点?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    我认为您需要GroupBy.transformmean 来获得Series 与原始DataFrame 相同的大小,因此可以通过Series.sub 减去列:

    s = self.data_train.groupby('userId')['rating'].transform('mean')
    self.data_train['new'] = self.data_train['rating'].sub(s)
    

    示例:更改 userId 中的数据以获得更好的示例

    print (data_train)
           userId  movieId  rating   timestamp
    65414     466      608     4.0   945139883
    79720     466     6218     4.0  1089518106
    63354     457     4007     3.5  1471383787
    29923     466    59333     2.5  1462636955
    63651     457   102194     2.5  1471383710
    
    s = data_train.groupby('userId')['rating'].transform('mean')
    print (s)
    65414    3.5
    79720    3.5
    63354    3.0
    29923    3.5
    63651    3.0
    Name: rating, dtype: float64
    
    data_train['new'] = data_train['rating'].sub(s)
    print (data_train)
           userId  movieId  rating   timestamp  new
    65414     466      608     4.0   945139883  0.5
    79720     466     6218     4.0  1089518106  0.5
    63354     457     4007     3.5  1471383787  0.5
    29923     466    59333     2.5  1462636955 -1.0
    63651     457   102194     2.5  1471383710 -0.5
    

    【讨论】:

    • 你能详细说明s = data_train.groupby('userId')['rating'].transform('mean')行的每个步骤吗?我无法解读文档。或者我无法通过打印 data_train.groupby('userId') data_train.groupby('userId')['rating'] 来查看它们是什么......无论如何谢谢
    • @eugene - 所以导入部分代码是 here - df['C'].groupby(df['A'])(更详细)与 df.groupby('A')['C'] 相同(常用)
    • @eugene - transformaggregation 之间的区别是可能的检查 this
    • 哇,文件平易近人!谢谢。希望 pandas 的文档可以作为 jupyter 执行
    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多