将列表中的字符串数据转换为python中的数值| unhable type:'list'

2024-05-15 14:11:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个清单如下,这是一个巨大的清单,这只是它的一大块。你知道吗

 my_list= [['I. R. Palmer','U. Kersten'],
           ['H. Breitwieser', 'U. Kersten'],
           ['Halvard Skogsrud', 'Boualem Benatallah', 'Fabio Casati', 'Manh Q. Dinh'],
           ['Stefano Ceri', 'Piero Fraternali', 'Stefano Paraboschi']]

我想给列表中的每个字符串分配一个唯一的数值。如果某个字符串在其他地方重复,请为其指定相同的上一个值

new_list= [[0,1],
           [2,1],
           [3,4,5,6],
           [7,8,9]]

我试过了

pd.factorize(my_list)

但我越来越

unhashable type: 'list'

Tags: 字符串myliststefanofabiodinhpalmermanh
3条回答

您可以展平列表,使用factorize处理1d数组,通过zip创建dict并在嵌套列表中替换:

a = [y for x in my_list for y in x]
f1, f2 = pd.factorize(a)
d = dict(zip(f2[f1], f1))

new_list = [[d[y] for y in x] for x in my_list]
print (new_list)
[[0, 1], [2, 1], [3, 4, 5, 6], [7, 8, 9]] 

pandas.factorize对一维序列进行运算,但有一个二维序列。由于你的二维序列不是一个规则的形状(每个内部列表有不同的长度),你不能通过重塑来解决这个问题。您看到的错误是因为pandas试图将内部列表视为类别,而不是内部列表中的字符串。你知道吗

您可以自己构建结果:

authors_map = {}  # I'm just guessing that they're authors
next_id = 0
new_list = []
for authors in my_list:
    new_authors = []
    for author in authors:
        if author not in authors_map:
            authors_map[author] = next_id
            next_id += 1
        new_authors.append(authors_map[author])
    new_list.append(new_authors)

pd.factorize中只能有一个一维序列。参考doc

您可以使用np.concatenate将列表转换为1D

import numpy as np
print(np.concatenate(my_list))
# array(['I. R. Palmer', 'U. Kersten', 'H. Breitwieser', 'U. Kersten',
#   'Halvard Skogsrud', 'Boualem Benatallah', 'Fabio Casati',
#   'Manh Q. Dinh', 'Stefano Ceri', 'Piero Fraternali',
#   'Stefano Paraboschi'], dtype='<U18')

print(pd.factorize(np.concatenate(my_list)))

输出:

(array([0, 1, 2, 1, 3, 4, 5, 6, 7, 8, 9], dtype=int64),
 array(['I. R. Palmer', 'U. Kersten', 'H. Breitwieser', 'Halvard Skogsrud',
        'Boualem Benatallah', 'Fabio Casati', 'Manh Q. Dinh',
        'Stefano Ceri', 'Piero Fraternali', 'Stefano Paraboschi'],
       dtype=object))

相关问题 更多 >