Python 字符串Panda系列到字符串变量

Python 字符串Panda系列到字符串变量,python,pandas,Python,Pandas,一直在寻找从dataframe中的字符串列获取字符串变量的方法。在最基本的场景中,我有一个名为name的字符串变量,它是基于空间排列的,用于获取字符串列表(在名为name的示例中)。然后,列表作为参数发送给函数,以处理列表中的每个元素: name = "4 PAWS ONLY" type(name) #String type names= name.split() type(names) #list type print(names) #['4', 'PAWS', 'ONLY'] #avg_v

一直在寻找从dataframe中的字符串列获取字符串变量的方法。在最基本的场景中,我有一个名为name的字符串变量,它是基于空间排列的,用于获取字符串列表(在名为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_语句_向量执行时没有错误,因为参数满足函数输入

在理想情况下,相同的逻辑适用,但适用于数据帧的每一行。字符串来自名为“name”(而不是字符串变量)的列,该列需要以与上一个示例相同的方式获取spplit,并将列表传递给函数

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

函数的执行显示以下错误:

<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'
如何从dataframe字符串列传递字符串列表?还有其他可能的失败原因吗

谢谢

您可以通过以下方式使用:

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\u-sensition\u-vector
函数返回传递列表的长度,当然它可以是任何内容。您也可以传递所有需要的额外参数

评论后编辑 注意不要将函数的参数与
apply
参数混用,如
axis
。如果函数接受多个参数,则需要执行以下操作:

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

其中,
表示函数可能需要的任何其他参数。它们都需要在
平均句子向量的括号内
,axis=1必须是最后一个。

只是为了确保我理解了:您想将
avg_-vector
函数应用于列
names
的每个元素,并将结果存储在列
avg_-vector
中吗?谢谢您的回答Valentino,是的,我需要对列名的每个元素调用avg_语句_vector函数,并将其存储在列avg_vector中。在本例中,avg_vector只是一个变量,但它是数据帧中的另一列。谢谢你的回答,瓦伦蒂诺,我看到你的例子在打印
df
dataframe时效果很好,但在我的代码中应用如下:
--->7 df['avg\u vector']=df.apply(lambda row:avg\u句子向量(row['names'].split(),axis=1,model=word2vec\u model,num\u features=300,indexword\u set=set(word2vec_model.wv.index2word)).tolist()
我得到了以下错误:
keyrorm:('names','occurrented at index names')
,即使包括axis=1。您将函数的参数与
apply
的参数混合在一起。我已经编辑了答案,请检查。这有意义,我意识到axis=1(将函数应用到列中的每一行)应该在末尾(正如您已经提到的),因此我编辑为
7df['avg_vector']=df.apply(lambda行:avg_句子_vector(行['names'].split(),model=word2vec_model,num_features=300,indexword_set=set(word2vec_model.wv.indexword)).tolist(),axis=1)
并获得一个新错误:
AttributeError:(“'int'对象没有属性'tolist',发生在索引0')
如果未理解,则额外的
存在,因为to list使用的是avg_语句向量的结果,如下所示:
df['avg_向量']=df.apply(lambda行:avg_语句向量(row…,index2word\u set=set(word2vec\u model.wv.index2word)).tolist()
其中n-1
正在关闭
set
,最后一个
正在关闭
avg\u-vector
。您的函数似乎没有像预期的那样返回numpy数组,只有一个整数。检查函数的返回值。
         names  avg_vector
0  4 PAWS ONLY           3
df['avg_vector'] = df.apply(lambda row : avg_sentence_vector(row['names'].split(), model=word2vec_model, num_features=300, ...), axis=1)