如何将值列表映射到分类向量

时间:2019-06-24 13:28:23

标签: python pandas

我正在尝试根据时长对视频数据集进行一些聚类。我有一本字典,其中的键是用户ID,值是浮动列表(视频时长),用户创建的每个视频1个浮动。

示例:

videos_per_user = {
    63: [15.011667, 21.823333, 29.981667, 10.341667, 14.928333, 16.555, 29.976667], 
    64: [5.463333, 14.345, 5.571667, 18.848333]
}

重要说明:这些列表的长度不同。

我想要做的就是根据参考向量(箱)将这个字典转换为pandas数据框,这样我可以为每个用户提供一个向量,其中包含每个类别的视频数量。

我已经创建了我的分类向量,如下所示: bins = pd.Series(np.arange(start=0,stop=35,step=5))

我尝试使用pd.cut(videos_per_user, bins=bins, right=True),但是在尝试获取类似[0,0,2,2,3,0]

时,我会得到每个持续时间对应的类别

有什么想法吗?我没有在网上找到类似的情况,但这可能是因为我并不真正地知道如何正确地表达我的问题。

最后,我想为我的字典中的每个用户创建一个长度为6(6个类别)的向量,并带有相应持续时间的视频数量。

3 个答案:

答案 0 :(得分:1)

我认为您要做的第一件事是克服字典差异的大小。我能想到的唯一方法是使用dict理解:

df = pd.DataFrame([(k,a) for k,v in videos_per_user.items() 
                         for a in v], 
                  columns=('user', 'val'))

# cut by bins
df['cat'] = pd.cut(df.val, bins=bins)

# pivot to get the data
df.pivot_table(index='user', columns='cat', aggfunc='count')

输出:

         val                                    
cat  (5, 10] (10, 15] (15, 20] (20, 25] (25, 30]
user                                            
63       NaN      2.0      2.0      1.0      2.0
64       2.0      1.0      1.0      NaN      NaN

答案 1 :(得分:1)

searchsortedbincount

b = np.arange(5, 30, 5)
# array([ 5, 10, 15, 20, 25])

请注意minlength可以保证所有数组的长度相同。但是,需要将其设置为您期望的实际类别数。如果您的实际设置与问题中所描述的不完全相同,则可以更改。

pd.DataFrame({
    user: np.bincount(b.searchsorted(durations), minlength=len(b) + 1)
    for user, durations in videos_per_user.items()
})

   63  64
0   0   0
1   0   2
2   2   1
3   2   1
4   1   0
5   2   0

value_countscut

pd.DataFrame({
    user: pd.value_counts(pd.cut(durations, bins))
    for user, durations in videos_per_user.items()
})

          63  64
(0, 5]     0   0
(5, 10]    0   2
(10, 15]   2   1
(15, 20]   2   1
(20, 25]   1   0
(25, 30]   2   0

答案 2 :(得分:0)

使用pd.cut(),您可以执行以下操作:

pd.cut(videos_per_user, 6)