pandas DataFrame使用apply()时出现'list'无map属性报错如何解决?
问题排查:pandas apply调用抛出
AttributeError: 'list' object has no attribute 'map' 错误根因
调用DataFrame.apply(..., axis=1)时,传入自定义函数的参数是单行对应的pandas Series对象,而非完整DataFrame。此时取email['POS_Tag']拿到的是该行存储的列表本身,列表没有map方法,因此抛出属性错误。
你之前手动逐行运行代码正常,是因为当时操作的是整个DataFrame的POS_Tag列,该列属于Series类型,本身支持map方法,逻辑可正常执行。
解决方案
推荐直接对全量DataFrame处理,不需要逐行apply,执行效率更高,代码如下:
import pandas as pd from collections import Counter # 直接对全量POS_Tag列统计词性计数 tag_count_data = pd.DataFrame(emails['POS_Tag'].map(lambda x: Counter(tag[1] for tag in x)).to_list()) emails = pd.concat([emails, tag_count_data], axis=1).fillna(0) pos_columns = ['PRP','MD','JJ','JJR','JJS','RB','RBR','RBS', 'NN', 'NNS','VB', 'VBS', 'VBG','VBN','VBP','VBZ'] for pos in pos_columns: if pos not in emails.columns: emails[pos] = 0 emails = emails[['text'] + pos_columns] emails['Adjectives'] = emails['JJ'] + emails['JJR'] + emails['JJS'] emails['Adverbs'] = emails['RB'] + emails['RBR'] + emails['RBS'] emails['Nouns'] = emails['NN'] + emails['NNS'] emails['Verbs'] = emails['VB'] + emails['VBS'] + emails['VBG'] + emails['VBN'] + emails['VBP'] + emails['VBZ']
如果必须保留apply的使用方式,可调整自定义函数适配单行输入,代码如下:
import pandas as pd from collections import Counter def extractGrammar(email): # 直接统计当前行的词性计数 tag_counter = Counter(tag[1] for tag in email['POS_Tag']) res = email.to_dict() res.update(tag_counter) # 补全缺失的词性列 pos_columns = ['PRP','MD','JJ','JJR','JJS','RB','RBR','RBS', 'NN', 'NNS','VB', 'VBS', 'VBG','VBN','VBP','VBZ'] for pos in pos_columns: res[pos] = res.get(pos, 0) # 计算四类词性总和 res['Adjectives'] = res['JJ'] + res['JJR'] + res['JJS'] res['Adverbs'] = res['RB'] + res['RBR'] + res['RBS'] res['Nouns'] = res['NN'] + res['NNS'] res['Verbs'] = res['VB'] + res['VBS'] + res['VBG'] + res['VBN'] + res['VBP'] + res['VBZ'] return pd.Series(res) emails = emails.apply(extractGrammar, axis=1)
内容的提问来源于stack exchange,提问作者deLaJU
相关产品推荐
相关产品推荐

