如何用循环高效实现按列拆分Pandas DataFrame并做词频统计?
用循环简化Pandas谷物推文词频统计代码
原始数据与手动实现代码
首先是包含谷物推文的DataFrame定义:
import pandas as pd df = pd.DataFrame([['Cheerios', 'I love Cheerios they are the best'], ['FrostedFlakes', 'Frosted Flakes taste delicious'], ['FruityPebbles', 'Fruity Pebbles is a terrible cereal'], ['Cheerios', 'Honey Nut Cheerios are the greatest cereal'], ['FrostedFlakes', 'Frosted Flakes are grrrreat'], ['FruityPebbles', 'Fruity Pebbles are terrible']], columns=['Label', 'Tweet'])
当前手动实现的重复代码:
# 按Label拆分DataFrame cereals0 = df[df["Label"] == 'Cheerios'] cereals1 = df[df["Label"] == 'FrostedFlakes'] cereals2 = df[df["Label"] == 'FruityPebbles'] # 拆分文本、统计词频并重置索引 cereals0 = cereals0.Tweet.str.split(expand=True).stack().value_counts().reset_index() cereals1 = cereals1.Tweet.str.split(expand=True).stack().value_counts().reset_index() cereals2 = cereals2.Tweet.str.split(expand=True).stack().value_counts().reset_index() # 重命名列 cereals0.columns = ['Word', 'Frequency'] cereals1.columns = ['Word', 'Frequency'] cereals2.columns = ['Word', 'Frequency']
问题分析
你尝试的循环代码没有得到预期结果,原因是:循环内的变量cereal只是临时覆盖,没有持久化存储每次循环的结果,循环结束后只会保留最后一次循环的处理结果,之前的都会被丢弃。
正确循环实现方案
可以用字典来存储每个谷物对应的词频统计结果,键为谷物名称,值为处理后的DataFrame:
# 创建空字典存储结果 cereal_word_counts = {} # 遍历所有唯一的谷物Label for cereal_name in df.Label.unique(): # 筛选对应Label的数据,处理词频统计 temp_df = df[df["Label"] == cereal_name].Tweet.str.split(expand=True).stack().value_counts().reset_index() # 重命名列 temp_df.columns = ['Word', 'Frequency'] # 将结果存入字典 cereal_word_counts[cereal_name] = temp_df
之后可以通过字典键访问对应谷物的词频统计结果,比如:
# 查看Cheerios的词频 print(cereal_word_counts['Cheerios']) # 查看FrostedFlakes的词频 print(cereal_word_counts['FrostedFlakes'])
更高效的Pandas分组实现(可选)
除了循环,还可以用Pandas的groupby直接实现分组统计,代码更简洁:
# 分组后统一处理 result = df.groupby('Label')['Tweet'].apply( lambda x: x.str.split(expand=True).stack().value_counts().reset_index(name='Frequency') ).rename(columns={'index': 'Word'}).reset_index()
这个结果是一个包含所有谷物词频的单DataFrame,其中Label列对应谷物名称,Word和Frequency分别为词和频次。
内容的提问来源于stack exchange,提问作者BDuff
相关产品推荐
相关产品推荐

