我试图从存储在df中的命名元组列表中提取第n个元素,如下所示:
df['text'] = [Tag(word='Come', pos='adj', lemma='Come'), Tag(word='on', pos='nounpl', lemma='on'), Tag(word='Feyenoord', pos='adj', lemma='Feyenoord')]
我试图仅从每个元组中提取包含pos信息的元素。这是我想要实现的结果:
df['text'] = ['adj', 'nounpl', 'adj']
这是我迄今为止所尝试过的:
d =[]
count = 0
while count < df['text'].size:
d.append([item[1] for item in df['text'][count]])
count += 1
dfpos = pd.DataFrame({'text':d})
df['text']= pd.DataFrame({'text':d})
df['text']=df['text'].apply(lambda x: ', '.join(x))
这就是错误:IndexError: tuple index out of range
我错过了什么?
解决方案:似乎最简单的解决方案是将元组转换为列表。我不确定这是否是最佳解决方案,但它确实有效。
d =[]
count = 0
while count < df['text'].size:
temp=([list(item[1:-1]) for item in df['text'][count]])
d.append(sum(temp, []))
count += 1
df['text']= pd.DataFrame({'text':d})
df['text2']=df['text'].apply(lambda x: ', '.join(x))
答案 0 :(得分:2)
如果Tag是您的命名元组,则尝试使用apply进行索引,即
数据准备:
from collections import namedtuple
Tag = namedtuple('Tag', 'word pos lemma')
li = [Tag(word='Come', pos='adj', lemma='Come'), Tag(word='on', pos='nounpl', lemma='on'), Tag(word='Feyenoord', pos='adj', lemma='Feyenoord')]
df = pd.DataFrame({'text':li})
对于基于属性的选择,在申请中使用.
,因为它是一个命名元组,即
df['new'] = df['text'].apply(lambda x : x.pos)
如果您需要基于索引的选择,请使用
df['new'] = df['text'].apply(lambda x : x[1] if len(x)>1 else np.nan)
输出df['new']
0 adj 1 nounpl 2 adj Name: text, dtype: object
另一种解决方案是使用str[1]
作为namedtuple
中的选择值:
df['text1'] = df['text'].str[1]
print (df)
text text1
0 (Come, adj, Come) adj
1 (on, nounpl, on) nounpl
2 (Feyenoord, adj, Feyenoord) adj