Строка Panda серии в строковую переменную - PullRequest
0 голосов
/ 20 сентября 2019

Искал способ получить строковую переменную из строкового столбца в фрейме данных.В самом простом сценарии у меня есть переменная String с именем name, которая разбивается на части по пространству для получения списка строк (в примере с именами).Затем список отправляется в качестве параметра функции для обработки каждого элемента списка:

name = "4 PAWS ONLY"
type(name) #String type
names= name.split()
type(names) #list type
print(names) #['4', 'PAWS', 'ONLY']

#avg_vector needs a list of string, called names
avg_vector = avg_sentence_vector(names, model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist()

В этом базовом сценарии avg_sentence_vector выполняется без ошибок, поскольку аргументы удовлетворяют вводу функции.

В идеальном сценарии применяется та же логика, но для каждой строки кадра данных.Строки поступают из столбца с именем «name» (вместо строковой переменной), который нужно разбить на части так же, как и в предыдущем примере, и передать список функции.

До сих пор я не смог получить список строк после разделения значения String из столбца «name»:

names = ['4 PAWS ONLY']
df = pd.DataFrame(data=None, index=range(1), columns=['names', 'avg_vector'])
df['names'] = names

vname = df.names.apply(str)
type(vname) #pandas.core.series.Series

vnames = vname.str.split()
type(vnames) #pandas.core.series.Series

print(vname)
0    [4, PAWS, ONLY]
Name: names, dtype: object

#avg_vector needs a list of string, called vnames
avg_vector = avg_sentence_vector(vnames, model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist()

При выполнении функции отображается следующая ошибка:

<ipython-input-9-2abbbce044f5> in avg_sentence_vector(words, model, num_features, index2word_set)
---> 11         if word in index2word_set:
     12             nwords = nwords+1
     13             featureVec = np.add(featureVec, model[word])

TypeError: unhashable type: 'list'

Тело функции avg_sentence_vector выглядит следующим образом:

##Get average 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:
        print(word)
        print(index2word_set)
        if word in index2word_set:
            nwords = nwords+1
            featureVec = np.add(featureVec, model[word])

    if nwords>0:
        featureVec = np.divide(featureVec, nwords)
    return featureVec

Как передать список строк из столбца строки данных в фрейме?Есть ли другая возможная причина сбоя?

Спасибо

1 Ответ

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

Вы можете сделать это, используя применить следующим образом:

def avg_sentence_vector(ll, *args, **kwargs):
    return len(ll)

df['avg_vector'] = df.apply(lambda row : avg_sentence_vector(row['names'].split()), axis=1)

Это возвращает:

         names  avg_vector
0  4 PAWS ONLY           3

Как вы видите, в моем случаеavg_sentence_vector функция возвращает длину переданного списка, но, конечно, это может быть что угодно.Вы также можете передать все дополнительные аргументы, которые хотите.

РЕДАКТИРОВАТЬ после комментариев

Будьте осторожны, чтобы не смешивать аргументы вашей функции с apply аргументами, такими как axis.Если ваша функция принимает более одного аргумента, вам нужно сделать:

df['avg_vector'] = df.apply(lambda row : avg_sentence_vector(row['names'].split(), model=word2vec_model, num_features=300, ...), axis=1)

, где ... обозначает любой другой аргумент, который может потребоваться вашей функции.Все они должны быть в скобках avg_sentence_vector, а ось = 1 должна быть последней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...