Python 如何将值列表映射到分类向量
我正在尝试根据持续时间对视频数据集进行聚类。我有一个字典,其中键是用户ID,值是浮动列表(视频持续时间),用户创建的每个视频1个浮动 例如:Python 如何将值列表映射到分类向量,python,pandas,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] } 重要提示:这些列表的长度不同 我想做的是将这个
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]
}
重要提示:这些列表的长度不同
我想做的是将这个dict转换成一个基于参考向量(bins)的pandas数据帧,这样我就可以为每个用户提供一个向量,其中包含每个类别的视频数量
我创建了分类向量,如下所示:
bin=pd.系列(np.arange(开始=0,停止=35,步骤=5))
我曾尝试使用pd.cut(每个用户的视频,bins=bins,right=True)
,但在尝试获取类似以下内容时,我获得了每个持续时间的相应类别:[0,0,2,2,3,0]
有什么想法吗?我在网上没有发现类似的情况,但可能是因为我真的不知道如何正确地表述我的问题
最后,我想为我的dict中的每个用户创建一个长度为6(6个类别)的向量,以及相应持续时间的视频数量。我认为您要做的第一件事是克服dict的大小差异。我能想到的唯一方法是使用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
使用pd.cut()
可以执行以下操作:
pd.cut(每个用户6个视频)
searchsorted
和bincount
请注意:确保所有数组长度相同的是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
值\u计数
和切割
我得到以下异常:
ValueError:数组必须都是相同长度的
是的,但我也测试了您的解决方案,因为它似乎符合我的要求。您测试了哪一个?它们都导致了相同的错误吗?哦,你是对的,带有searchsorted
和bincount
的那个给了我上面的错误。您使用value\u counts
和cut
的解决方案运行良好。您是否指定了minlength=6
?谢谢,这就是我想要做的!我在创建透视表时添加了fill\u value=0
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
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