如何在NLTK python中将列从数据帧传递到wordnet.synsets()

如何在NLTK python中将列从数据帧传递到wordnet.synsets(),python,pandas,nltk,Python,Pandas,Nltk,我有一个数据框,其中一列包含英语单词。我想通过NLTKs synsets()函数传递该列中的每个元素。我的问题是synsets()一次只接收一个单词 e、 g wordnet.synsets('父') 现在,如果我有如下数据帧: dc = {'A':[0,9,4,5],'B':['father','mother','kid','sister']} df = pd.DataFrame(dc) df A B 0 0 father 1 9 mother 2 4 ki

我有一个数据框,其中一列包含英语单词。我想通过NLTKs synsets()函数传递该列中的每个元素。我的问题是synsets()一次只接收一个单词

e、 g wordnet.synsets('父')

现在,如果我有如下数据帧:

dc = {'A':[0,9,4,5],'B':['father','mother','kid','sister']}
df = pd.DataFrame(dc)
df
   A       B
0  0  father
1  9  mother
2  4     kid
3  5  sister
我想通过synsets()函数传递列B,并使另一列包含其输出。我希望在不遍历数据帧的情况下执行此操作


如何做到这一点?

您可以使用
apply
方法:

In [4]: df['C'] = df['B'].apply(wordnet.synsets)

In [5]: df
Out[5]: 
   A       B                                                  C
0  0  father  [Synset('father.n.01'), Synset('forefather.n.0...
1  9  mother  [Synset('mother.n.01'), Synset('mother.n.02'),...
2  4     kid  [Synset('child.n.01'), Synset('kid.n.02'), Syn...
3  5  sister  [Synset('sister.n.01'), Synset('sister.n.02'),...
然而,拥有一列列表通常不是一个非常有用的数据结构。最好将每个同义词放在自己的列中。您可以通过使回调函数返回一个
pd.Series

In [29]: df.join(df['B'].apply(lambda word: pd.Series([w.name for w in wordnet.synsets(word)])))
Out[29]: 
   A       B            0                1            2                   3  \
0  0  father  father.n.01  forefather.n.01  father.n.03  church_father.n.01   
1  9  mother  mother.n.01      mother.n.02  mother.n.03         mother.n.04   
2  4     kid   child.n.01         kid.n.02     kyd.n.01          child.n.02   
3  5  sister  sister.n.01      sister.n.02  sister.n.03           baby.n.05   

             4                     5             6         7           8  
0  father.n.05           father.n.06  founder.n.02  don.n.03  beget.v.01  
1  mother.n.05           mother.v.01    beget.v.01       NaN         NaN  
2     kid.n.05  pull_the_leg_of.v.01      kid.v.02       NaN         NaN  
3          NaN                   NaN           NaN       NaN         NaN  
(我选择只显示每个
Synset
name
属性;您当然可以使用

df.join(df['B'].apply(lambda word: pd.Series(wordnet.synsets(word))))

如果您想要
Synset
对象本身。)

语法可能会隐藏它,但是您选择的任何解决方案都会在数据帧中进行迭代。耶,我知道。我的意思是,我想避免“for”在帧上循环。我试着申请了,但似乎没用。谢谢!!我在使用apply()时发现了我的愚蠢错误。我确实应用了(wordnet.synsets())如何做相似但不同的事情。如果我的pandas数据框中有一列,其中每一行都包含大量文本,那么我希望整个pandas数据框中的每个同义词都只转换为一个同义词(因此,如果我的dataframe列包含hi,hello,hey,我希望它只剩下dataframe中的一个,并且在应用此函数后,所有其他的都转换为该列)@mkheifetz:这似乎足够复杂,值得提出自己的问题。