Python推文元数据提取脚本替换for循环为列表推导式后触发AttributeError的问题排查求助
解决列表推导式中Pandas Series无split方法的错误
嘿,我来帮你搞定这个问题!你遇到的AttributeError: 'Series' object has no attribute 'split'其实是个常见的Pandas小坑,咱们一步步拆解原因并修复。
错误根源
你的text_df是只有一列的DataFrame,当你用tweet.loc[j]时,你获取的是DataFrame的一整行——这是一个Pandas Series对象,而不是你要处理的单个字符串推文。Series本身没有split()方法,自然就会触发错误。之前用for循环时可能你是直接取了列的元素,但改成列表推导式后误取了整行,才导致问题。
修复方案1:修正列表推导式的迭代对象
直接获取存储推文的列(这里列名是0),迭代这个列的每个字符串元素,就能正常调用字符串方法了:
import re import pandas as pd def tweetFeatures(tweet): # 先拿到存储推文的列,得到一个字符串元素组成的Series tweet_text = tweet[0] # 统计每个推文的单词数 wordcount = [len(text.split()) for text in tweet_text] # 统计每个推文的字符数 chars = [len(text) for text in tweet_text] # 提取每个推文的提及用户 mentions = [list(re.findall("@([a-zA-Z0-9_]{1,50})", text)) for text in tweet_text] # 统计每个推文的提及数量 mention_count = [len(m) for m in mentions] # 提取每个推文的话题标签 hashtags = [list(re.findall("#([a-zA-Z0-9_]{1,50})", text)) for text in tweet_text] # 统计每个推文的话题标签数量 hashtag_count = [len(h) for h in hashtags] # 提取每个推文的URL url = [list(re.findall("(?P<url>https?://[^\s]+)", text)) for text in tweet_text] # 统计每个推文的URL数量 url_count = [len(u) for u in url] # 将所有特征整合为DataFrame feats = {"n_words":wordcount,"n_chars":chars,"n_mentions":mention_count,"n_hashtag":hashtag_count,"n_url":url_count} feats_df = pd.DataFrame(feats) return feats_df
修复方案2:更Pandas化的实现(推荐)
用Pandas的apply方法直接对列操作,代码更简洁,也符合Pandas的使用习惯:
import re import pandas as pd def tweetFeatures(tweet): tweet_text = tweet[0] feats_df = pd.DataFrame() # 统计单词数 feats_df["n_words"] = tweet_text.apply(lambda x: len(x.split())) # 统计字符数 feats_df["n_chars"] = tweet_text.apply(len) # 封装提取函数,复用逻辑 def count_pattern(pattern, text): return len(re.findall(pattern, text)) # 统计提及数量 feats_df["n_mentions"] = tweet_text.apply(lambda x: count_pattern("@([a-zA-Z0-9_]{1,50})", x)) # 统计话题标签数量 feats_df["n_hashtag"] = tweet_text.apply(lambda x: count_pattern("#([a-zA-Z0-9_]{1,50})", x)) # 统计URL数量 feats_df["n_url"] = tweet_text.apply(lambda x: count_pattern("(?P<url>https?://[^\s]+)", x)) return feats_df
测试验证
用你的测试数据跑一下:
text = ["@Harrison2Jennifer Tokyo 2020 is so much fun. Loving every bit of it just as @MeggyJane & @Tommy620 say #Tokyo2020 https://www.corp.com", "Gabrielle Thomas is my favourite sprinter @TooSports https://www.flick.org https://www.bugger.com", "@Sports_head I wish the #Tokyo2020 @Olympics will never end #Athletics #Sprints", "I hate the attitude of officials at this olympics @Kieran https://www.launch.com", "Why can't the #Athletics be more exciting? #Tokyo2020", "It is so much fun to see beautful colors at the #Olympics"] text_df = pd.DataFrame(text) print(tweetFeatures(text_df))
运行后就能得到正确的特征DataFrame,不会再触发错误啦。
内容的提问来源于stack exchange,提问作者Ifeanyi Idiaye
相关产品推荐
相关产品推荐

