基于Pandas/Seaborn优化按条件统计日条目数的可视化方案
更简洁的实现方案:无需拆分DataFrame
嘿,我来给你分享几个更优雅的实现思路,不用拆分多个DataFrame就能完成按天分类统计并绘图的需求~
方案一:Pandas原生聚合(推荐)
核心思路是先给原DataFrame添加标记列,然后按日期一次性聚合所有分类的统计数据,最后直接绘图。
步骤1:添加关键词标记列
先给每条数据打上是否包含目标关键词的布尔标记:
import pandas as pd import matplotlib.pyplot as plt # 假设你的df已经是带datetime索引的格式 df['has_power'] = df['text'].str.contains('power') df['has_foo'] = df['text'].str.contains('foo') df['has_bar'] = df['text'].str.contains('bar')
步骤2:按日期聚合统计
用groupby配合agg一次性计算每日总数和各分类的数量:
daily_stats = df.groupby(df.index.date).agg( 总条目数=('text', 'size'), 含power=('has_power', 'sum'), # 布尔值求和就是True的数量 含foo=('has_foo', 'sum'), 含bar=('has_bar', 'sum') )
步骤3:绘图
直接用聚合后的DataFrame绘图,支持分组柱状图或堆叠柱状图:
# 分组柱状图(若想堆叠,添加stacked=True参数) daily_stats.plot(kind='bar', figsize=(10, 6), rot=0, colormap='Set2') plt.title('每日条目数分类统计') plt.xlabel('日期') plt.ylabel('数量') plt.legend(title='分类') plt.tight_layout() plt.show()
方案二:Seaborn 长格式数据绘图
Seaborn更擅长处理长格式数据,我们可以先把数据转成长格式,再用barplot实现可视化:
步骤1:数据转长格式
import seaborn as sns # 提取日期列 df['date'] = df.index.date # 将标记列转为长格式 melted_data = df.melt( id_vars=['date'], value_vars=['has_power', 'has_foo', 'has_bar'], var_name='分类', value_name='包含关键词' ) # 只保留包含关键词的行,并简化分类名称 melted_data = melted_data[melted_data['包含关键词']] melted_data['分类'] = melted_data['分类'].str.replace('has_', '') # 补充每日总条目数的数据 total_data = df.groupby('date').size().reset_index(name='数量') total_data['分类'] = '总条目数' # 合并分类数据和总数据 final_data = pd.concat([ melted_data.groupby(['date', '分类']).size().reset_index(name='数量'), total_data ], ignore_index=True)
步骤2:Seaborn绘图
plt.figure(figsize=(10, 6)) sns.barplot( data=final_data, x='date', y='数量', hue='分类', palette='viridis' ) plt.title('每日条目数分类统计') plt.xlabel('日期') plt.ylabel('数量') plt.legend(title='分类') plt.tight_layout() plt.show()
方案优势
- 全程基于原DataFrame操作,无需拆分多个子DataFrame,代码更简洁易维护
- 聚合逻辑清晰,后续添加新关键词分类只需新增标记列即可
- 绘图代码高度复用,可快速切换分组/堆叠等展示形式
内容的提问来源于stack exchange,提问作者jayko03
相关产品推荐
相关产品推荐

