使用带有单列转置的Pandas将数据集的矩阵打印到表中

时间:2017-06-28 14:56:49

标签: python python-2.7 csv pandas numpy

我在Python Pandas中使用Movie Lens Dataset。我需要在foll中打印u.data一个制表符分隔文件的矩阵。方式

NULL    MovieID1 MovieID2 MovieID3
UserID1 Rating   Rating   Rating
UserID2 Rating   Rating   Rating

我已经通过以下链接

  1. One - 数据集非常庞大,将其串联起来
  2. Two - 未提及的行转置
  3. Three - 尝试使用reindex 在一列中获取NaN值
  4. Four - df.ilocdf.ix
  5. 也没有工作

    我需要输出,因为它显示了电影w.r.t的评级和NaN(未评级时)。用户。

        NULL    MovieID1 MovieID2 MovieID3
        UserID1 Rating   Rating   NaN
        UserID2 Rating   NaN      Rating
    

    P.S。我不介意使用numpy,crab,recsys,csv或任何其他python包解决方案

    编辑1 - 对数据进行排序并导出,但得到了一个额外的字段

    df2 = df.sort_values(['UserID','MovieID'])
    print type(df2)
    df2.to_csv("sorted.csv")
    print df2
    

    该文件生成foll。 sorted.csv 文件

    ,UserID,MovieID,Rating,TimeStamp
    32236,1,1,5,874965758
    23171,1,2,3,876893171
    83307,1,3,4,878542960
    62631,1,4,3,876893119
    47638,1,5,3,889751712
    5533,1,6,5,887431973
    70539,1,7,4,875071561
    31650,1,8,1,875072484
    20175,1,9,5,878543541
    13542,1,10,3,875693118
    

    编辑2 - 正如评论中所述

    这里是u.data文件中用作输入的数据格式

    196 242 3   881250949
    186 302 3   891717742
    22  377 1   878887116
    244 51  2   880606923
    166 346 1   886397596
    298 474 4   884182806
    115 265 2   881171488
    253 465 5   891628467
    305 451 3   886324817
    

1 个答案:

答案 0 :(得分:2)

一种方法:

使用pivot_table,如果每个用户和电影ID一个值,那么aggfunc并不重要,但如果有多个值,则选择您的聚合。

df.pivot_table(values='Rating',index='UserID',columns='MovieID', aggfunc='mean')

第二种方法(没有重复的用户ID,movieid记录):

df.set_index(['UserID','MovieID'])['Rating'].unstack()

第三种方法(没有重复的用户ID,movieid记录):

df.pivot(index='UserID',columns='MovieID',values='Rating')

第四种方法(就像你可以选择聚合方法的第一种方法):

df.groupby(['UserID','MovieID'])['Rating'].mean().unstack()

输出:

MovieID  1   2   3   4   5   6   7   8   9   10
UserID                                         
1         5   3   4   3   3   5   4   1   5   3