У меня есть Panda Dataframe, который состоит всего из одного столбца с именем «name».Я искал, как перебирать строки данных, чтобы получить значение имени, и в этой же строке добавить еще один столбец с именем «векторы», который будет хранить список векторов в каждой строке.
Например,значение, которое будет сохранено в столбце «векторы», возвращает массив из 300 чисел из функции «avg_sentence_vector»:
def avg_sentence_vector(words, model, num_features, index2word_set):
#function to average all words vectors in a given paragraph
featureVec = np.zeros((num_features,), dtype="float32")
nwords = 0
for word in words:
if word in index2word_set:
nwords = nwords+1
featureVec = np.add(featureVec, model[word])
if nwords>0:
featureVec = np.divide(featureVec, nwords)
return featureVec
Исходный кадр данных имеет только один столбец «имя», который содержит несколько строк имен:
name object
dtype: object
Я перебираю кадр данных следующим образом:
for index, row in df2.iterrows():
# access data using column names
name_n=row['name']
#This returns a list of vectors of float32
name_avg_vector = avg_sentence_vector(name_n.split(), model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist()
df2.loc[df2.index[index],'vectors']=name_avg_vector
Однако я получаю сообщение об ошибке: Должен иметь одинаковые ключи len и значение при установке с итерацией
Я также пытался присвоить значение следующим образом:
df2.iloc[index, df2.columns.get_loc('vectors')]=name_avg_vector
Как добавить значение из name_avg_vector в новый столбец "avg_vector" с соответствующим значением в каждой итерации?
Обновление:
Как и предполагал @Peruz, я изменил ранее включенный цикл (цель состояла в том, чтобы перебрать кадр данных, чтобы получить слова cпроисходит от имени и вызывает функцию avg_sentence_vector), и три строки, включая цикл for, были сжаты до этой единственной строки:
df2[['vectors']]= df2[['vectors']].apply(avg_sentence_vector(df.name.str.split(), model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist())
Однако после изменения я ищу способ устранения новой ошибки: тип unhashable: 'list'
Update2:
Я продолжаю получать тип unhashable: 'list', я пробовал очень простой сценарийсо следующими результатами:
Фрагмент A:
name = "4 PAWS ONLY"
vectors = avg_sentence_vector(name.split(), model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist()
Фрагмент A работает успешно.
Фрагмент B:
name = ['4 PAWS ONLY']
ndf = pd.DataFrame(data=None, index=range(1), columns=['name', 'vectors'])
ndf['name'] = name
ndf[['vectors']]=ndf[['vectors']].applymap(avg_sentence_vector(ndf.name.str.split(), model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist())
Сниппет B выдает ошибку unhashable тип: 'list'
Спасибо