Назначить список новому столбцу в Dataframe - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть 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'

Спасибо

1 Ответ

1 голос
/ 19 сентября 2019

кажется, ваш список зависит только от столбца names , прокомментируйте, если я ошибаюсь.Тогда Pandas.DataFrame.apply() (см. Также map()) может быть достаточно, если только вам не придется справляться с более высокой сложностью.

import pandas as pd
names = ['v1', 've2', 'vec3', 'vect4']
ndf = pd.DataFrame(data=None, index=range(4), columns=['names', 'added'])
ndf['names'] = names
ndf['added'] = ndf['names'].apply(len) # change len with your function and you can pass additional arguments too

Я надеюсь, что это помогает, и я не упускаю ключевую причину, по которой вы былицикл, который, как вы, вероятно, знаете, неэффективен при iterrows().

Редактировать

import pandas as pd
import numpy as np


def simple_function(l, num_features, extra_v):
    v = len(l)
    featureVec = np.zeros((num_features,), dtype="float32")
    featureVec += v
    featureVec += extra_v
    featureVec /= 2
    return(featureVec)

names = ['v1', 've2', 'vec3', 'vect4']
ndf = pd.DataFrame(data=None, index=range(4), columns=['names', 'added'])
ndf['names'] = names
ndf['added'] = ndf['names'].apply(simple_function, args=(5, 2))
print(ndf) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...