将列表元素映射到字典中的键以获取Python中的十进制值

2024-01-10

我有一个单词列表如下。

mylist = ['cat', 'yellow', 'car', 'red', 'green', 'jeep', 'rat','lorry']

我还有数据集中每篇文章的列表列表,其中包含“mylist”的值,如下面的示例所示(即,如果“mylist”单词出现在文章中,它会生成 0-1 之间的值)。

[[0,0.7,0,0,0,0.3,0,0.6], [0.2,0,0,0,0,0,0.8,0]]

换句话说,

[0,0.7,0,0,0,0.3,0,0.6] says that this only has values 'yellow', 'jeep', 'lorry'

现在我有一个类别字典如下。

mydictionary = {'colour': ['red', 'yellow', 'green'], 'animal': ['rat','cat'], 
'vehicle': ['car', 'jeep']}

现在,通过使用“mydictionary”键值,我想按如下方式转换列表列表(也就是说,如果“mylist”的一个或多个值为 1,我将该键标记为average分数的值)。

[[0.7, 0, 0.45], [0, 0.5, 0]]

换句话说,

[0.7, 0, 0.45] says that;
0.7 - average value for elements in 'colours' = 0.7/1 = 0.7
0 - no elements in 'animals'
0.45 - average value for elements in 'vehicles' = (0.3+0.6)/2 = 0.45

所以我的输出应该是上面提到的列表的列表 -> [[0.7, 0, 0.45], [0, 0.5, 0]]

我有兴趣知道是否可以使用 pandas 数据框来做到这一点。


您确实应该重新考虑您的数据结构。你将面临的一个问题是dict本质上是无序的。因此,首先,通过将值放入有序容器(alist工作正常):

>>> vals = [mydictionary['colour'], mydictionary['animal'], mydictionary['vehicle']]

现在是论文:

>>> essays = [[0,0.7,0,0,0,0.3,0,0.6], [0.2,0,0,0,0,0,0.8,0]]

然后,一个简单的循环,从构建地图mylist到每篇文章的权重,并使用statistics包一个mean功能:

>>> import statistics as stats
>>> result = []
>>> for essay in essays:
...     map = dict(zip(mylist, essay))
...     result.append([stats.mean(map[e] for e in v) for v in vals])
...
>>> result
[[0.2333333333333333, 0, 0.15], [0, 0.5, 0]]

老实说,不确定是否pandas是最好的工具,但我想你可以使用DataFrame像这样:

>>> df = pd.DataFrame({'essay{}'.format(i):essay for i, essay in enumerate(essays)}, index=mylist)
>>> df
        essay0  essay1
cat        0.0     0.2
yellow     0.7     0.0
car        0.0     0.0
red        0.0     0.0
green      0.0     0.0
jeep       0.3     0.0
rat        0.0     0.8
lorry      0.6     0.0

然后,制作石斑鱼映射:

>>> grouper  = {v: k for k, vv in mydictionary.items() for v in vv}

然后使用pd.DataFrame.groupby:

>>> df.groupby(grouper).mean()
           essay0  essay1
animal   0.000000     0.5
colour   0.233333     0.0
vehicle  0.150000     0.0

Edit

评论之后,修复非常简单,只需将权重具体化到一个列表中,过滤 0 即可,如下所示:[map[e] for e in v if map[e]],然后取mean该列表中的。但是,您必须注意该列表不为空。只需定义一个辅助函数来检查或返回默认值 0:

>>> def mean_default(seq):
...     if seq:
...         return stats.mean(seq)
...     else:
...         return 0
...

然后简单地:

>>> result = []
>>> for essay in essays:
...     map = dict(zip(mylist, essay))
...     result.append([mean_default([map[e] for e in v if map[e]]) for  in vals])

For pandas,正如@IanS所示,只需替换0 with np.nan.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将列表元素映射到字典中的键以获取Python中的十进制值 的相关文章

随机推荐