我正在尝试根据时长对视频数据集进行一些聚类。我有一本字典,其中的键是用户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个类别)的向量,并带有相应持续时间的视频数量。
答案 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)
searchsorted
和bincount
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_counts
和cut
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)