неописуемый тип: «список» в мешке слов - PullRequest
0 голосов
/ 17 мая 2019

У меня есть два списка слов, и я хочу объединить их. Я попробовал следующий метод ниже, но пока безуспешно.

bowA = df["Lang_1_text"].str.split(" ") 
bowB = df["Lang_2_text"].str.split(" ") 
print(bowA)
>>>[strike, kirsten, chlodowski, file, exchange]
print(bowB)
>>> [kirsten, exchange, outlook, freeze ]

Ожидаемый результат:

wordSet = set(bowA).union(set(bowB))

print(wordSet)
>>>[strike, kirsten, chlodowski, file, exchange, outlook, freeze]

Фактический результат:

TypeError Traceback (последний вызов был последним) в wordSet = set (bowA) .union (set (bowB)) TypeError: unhashable тип: 'list'

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Это потому, что когда вы делаете:

bowA = df["Lang_1_text"].str.split(" ") 
bowB = df["Lang_2_text"].str.split(" ") 

, bowA и bowB будут объектами серии.Вы можете проверить, напечатав их.Это будет выглядеть так:

>> type(bowA)
>> pandas.core.series.Series
>> type(bowA[0])
>> list

И каждый элемент в Серии будет списком.Когда вы приводите его к set (), он вызывает ошибку TypeError.Пример:

>> set([1,2,3]) # runs fine
>> set([[1],2,3]) # will raise the same error - TypeError: unhashable type: 'list'

Вы, вероятно, должны сделать что-то вроде ниже:

>> data = {"Lang_1_text": ['strike kirsten chlodowski file exchange'], "Lang_2_text": ['kirsten exchange outlook freeze']} 
>> df = pd.DataFrame(data) # Assuming `df` is the format you have 
>> # Now split it on space " "; and cast them as `set()` you can user `applymap`
>> # https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.applymap.html
>> data_1 = df.applymap(lambda x: set(x.split(" ")))
>> # Calculate the `union` data
>> union_data = data_1.apply(lambda x: x['Lang_1_text'].union(x['Lang_2_text']), axis=1)
>> print union_data.values[0]  # Or list(union_data.values[0]) to make it a list
>> {'chlodowski', 'exchange', 'file', 'freeze', 'kirsten', 'outlook', 'strike'}

Надеюсь, это поможет!

0 голосов
/ 17 мая 2019

Что-то не складывается. Этот код работает для меня:

bowA = ['strike', 'kirsten', 'chlodowski', 'file', 'exchange']
bowB = ['kirsten', 'exchange', 'outlook', 'freeze']

wordSet = set(bowA).union(set(bowB))
print(wordSet)

Несмотря на то, что обычно вы можете исправлять неисчислимые ошибки типов с помощью списков приведения к кортежу, существует какое-то разъединение, потому что здесь не имеет значения возможность переносимости.

...