Python更新DataFrame中tuple字符串元素报错及输出不符合预期问题
错误原因拆解
- 第一个
TypeError: 'tuple' object is not callable是因为你用了Python内置类型名tuple当变量名,覆盖了tuple类的定义,后续你想通过tuple(word, spacy_pos_tag)创建元组的时候,实际是调用你存储的元组变量,自然报错,你已经将变量名改为tuple_解决了这个问题。 - 第二个
TypeError: join() takes exactly one argument (2 given)是因为str.join()只接受一个可迭代对象参数,你传了position和tuple_两个参数,属于用法错误。 - 另外还有两个核心逻辑问题:
- 元组是不可变类型,你修改循环变量
tuple_的值不会更新pos_tags列表里对应的原元素 - 遍历
pos_tags的同时往里面append元素会导致无限循环,完全不符合需求
- 元组是不可变类型,你修改循环变量
可直接运行的修改后代码
import re # 假设cols是你提前定义好的标签列名,比如cols = ['in', 'tar'] for idx, row in df.iterrows(): doc = nlp(row['title']) # 初始化词性标注列表 pos_tags = [(token.text, token.pos_) for token in doc if not token.pos_ == "PUNCT"] # 用索引遍历才能修改列表内的元素 for idx_in_list, (original_word, spacy_pos_tag) in enumerate(pos_tags): # 你的位置是从1开始计数,所以索引+1 position = idx_in_list + 1 word = re.sub(r'[^\w\s]', '', original_word) # 匹配要打标签的位置 for col in cols: if position in row[col]: word = f'<{col.upper()}>{word}</{col.upper()}>' # 匹配到就跳出,避免重复打标签 break # 替换原位置的元组 pos_tags[idx_in_list] = (word, spacy_pos_tag) # 输出结果,也可以存回DataFrame新列 print(idx, "tokens, pos : ", pos_tags, "\n")
补充说明
如果需要把处理完的结果存回DataFrame,直接在循环末尾加一行df.loc[idx, 'processed_pos_tags'] = pos_tags即可,输出格式和你要求的示例完全一致。
内容的提问来源于stack exchange,提问作者joasa
相关产品推荐
相关产品推荐

