如何在Pandas数据帧中基于列值(int)合并行(带字符串)?

时间:2017-01-31 04:11:33

标签: python pandas

我的数据集格式为

df1=
 userid movieid    tags                     timestamp

    73  130682  b movie                     1432523704  
    73  130682  comedy                      1432523704  
    73  130682  horror                      1432523704  
    77  1199    Trilogy of the Imagination  1163220043  
    77  2968    Gilliam                     1163220138  
    77  2968    Trilogy of the Imagination  1163220039  
    77  4467    Trilogy of the Imagination  1163220065  
    77  4911    Gilliam                     1163220167  
    77  5909    Takashi Miike               1163219591

我希望另一个数据帧格式为

df2=

userid    tags
73       b movie[1] comedy[1] horror[1]
77       Trilogy of the Imagination[3] Gilliam[1] Takashi Miike[1] 

这样我就可以将所有标签合并在一起用于字数或字数。 在排序中,我希望一个用户ID的所有标签一起连接“”(一个空格),这样我也可以计算单词/ s的出现次数。我无法将标签中的字符串连接在一起。我可以数字和它的出现。任何帮助/建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先计算并重新格式化每组计数的结果。保持中间结果:

r = df.groupby('userid').apply(lambda g: g.tags.value_counts()).reset_index(level=-1)
r
Out[46]: 
                           level_1  tags
userid                                  
73                         b movie     1
73                          horror     1
73                          comedy     1
77      Trilogy of the Imagination     3
77                         Gilliam     2
77                   Takashi Miike     1

这个简单的字符串操作将为您提供每行的结果:

r.level_1+'['+r.tags.astype(str)+']'
Out[49]: 
userid
73                       b movie[1]
73                        horror[1]
73                        comedy[1]
77    Trilogy of the Imagination[3]
77                       Gilliam[2]
77                 Takashi Miike[1]

使用Python可以做到这样的事情:

(r.level_1+'['+r.tags.astype(str)+']').groupby(level=0).apply(' '.join)
Out[50]: 
userid
73                       b movie[1] horror[1] comedy[1]
77    Trilogy of the Imagination[3] Gilliam[2] Takas...