如何在Pandas的value_counts结果中添加对应topic列信息?
需求与解决方案
问题
给定如下Pandas DataFrame(字段说明:sentence=句子,userid=用户ID,topic=话题):
句子 用户ID 话题 hello 1001 闲聊 hi 1002 闲聊 hello 1002 闲聊 how are you? 1003 提问 hello 1004 闲聊 what is new? 1005 提问 hi 1006 闲聊 hello 1007 闲聊
执行df['句子'].value_counts()只能得到句子的频次统计,结果如下:
hello 4 hi 2 how are you? 1 what is new? 1
现在需要得到同时包含对应话题信息的统计结果,目标格式如下:
hello 4 闲聊 hi 2 闲聊 how are you? 1 提问 what is new? 1 提问
实现代码
方法一:分组聚合
利用groupby同时按「句子」和「话题」分组(因每个句子对应的话题唯一,分组不会拆分同一句子的统计),统计每组行数后格式化输出:
# 分组统计频次 stat_df = df.groupby(['句子', '话题']).size().reset_index(name='频次') # 按目标格式打印结果 for _, row in stat_df.iterrows(): print(f"{row['句子']} {row['频次']} {row['话题']}")
方法二:合并频次与映射表
先单独统计句子频次,再和去重后的「句子-话题」映射表合并,最后输出:
# 获取句子频次表 count_df = df['句子'].value_counts().reset_index(name='频次') # 获取句子与话题的唯一对应关系 topic_df = df[['句子', '话题']].drop_duplicates() # 合并两张表 result_df = count_df.merge(topic_df, on='句子') # 格式化输出 for _, row in result_df.iterrows(): print(f"{row['句子']} {row['频次']} {row['话题']}")
两种方法均能得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Tal1992
相关产品推荐
相关产品推荐

