过滤Twitter推文后name列变为整数的问题解决求助
问题原因
你遇到的问题核心是:在iterrows()返回的Series对象中,row.name是Series的内置属性,对应原DataFrame的索引值,而不是你要提取的name列的值。其他列(如content、language)因为没有和Series的内置属性重名,所以能正确获取列数据,只有name列被错误替换成了原索引的整数。
解决方案
方案1:修改原代码的取值方式
把row.name改成row['name'],通过索引访问列值,避免触发Series的内置属性:
def twitter_filter(df, search): date_ls = [] id_ls = [] content_ls = [] lan_ls = [] name_ls = [] retweet_ls = [] cleaned_tweet_ls = [] for i, row in df.iterrows(): if search in row.cleaned_tweet: date_ls.append(row.date) id_ls.append(row.id) content_ls.append(row.content) lan_ls.append(row.language) name_ls.append(row['name']) # 改为索引访问列值 retweet_ls.append(row.retweet) cleaned_tweet_ls.append(row.cleaned_tweet) new_dict = { "date": date_ls, "id": id_ls, "content": content_ls, "lan" : lan_ls, "name" : name_ls, "retweet" : retweet_ls, "cleaned_tweet": cleaned_tweet_ls, # 修正拼写错误:cleaned_tweeet → cleaned_tweet } new_df = pd.DataFrame(new_dict) return new_df
方案2:使用Pandas布尔索引(更高效)
iterrows()处理大数据时效率较低,推荐直接用Pandas布尔索引完成过滤,代码更简洁且性能更好:
def twitter_filter(df, search): # 生成布尔掩码:筛选cleaned_tweet包含search的行 mask = df['cleaned_tweet'].str.contains(search) # 直接筛选所需列 new_df = df.loc[mask, ['date', 'id', 'content', 'language', 'name', 'retweet', 'cleaned_tweet']] # 重命名language列为lan(和原输出格式保持一致) new_df = new_df.rename(columns={'language': 'lan'}) return new_df.reset_index(drop=True) # 可选:重置索引,移除原索引残留
内容的提问来源于stack exchange,提问作者Henry JH Lin
相关产品推荐
相关产品推荐

