字符串熊猫系列到字符串变量

时间:2019-09-20 19:31:36

标签: python pandas

一直在寻找从数据帧中的字符串列获取String变量的方法。在最基本的情况下,我有一个名为name的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”(而不是字符串变量)的列,将需要使用与前面示例相同的方式进行拆分,并将列表传递给函数。

到目前为止,从“名称”列中拆分字符串值后,我仍无法获得字符串列表:

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 个答案:

答案 0 :(得分:1)

您可以通过以下方式使用apply进行操作:

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的括号内,并且axis = 1必须是最后一个。