一直在寻找从数据帧中的字符串列获取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
如何传递数据框“字符串”列中的字符串列表?还有其他可能的故障原因吗?
谢谢
答案 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必须是最后一个。