从pandas Python中的命名元组列表中提取第n个元素?

时间:2017-11-05 10:40:25

标签: python list pandas tuples

我试图从存储在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))

1 个答案:

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