Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将值列表映射到分类向量_Python_Pandas - Fatal编程技术网

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

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] } 重要提示:这些列表的长度不同 我想做的是将这个

我正在尝试根据持续时间对视频数据集进行聚类。我有一个字典,其中键是用户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]
}
重要提示:这些列表的长度不同

我想做的是将这个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