Python如何转换DataFrame计算分类占比以绘制100%堆叠柱状图
实现方案
- 先预处理日期格式和无效数据,确保按天统计的维度统一
- 按日期、Flair分组统计单类发帖数量
- 结合每日总发帖量计算各Flair占比,单日所有分类占比总和为100%
- 透视转换为行是日期、列是Flair、值为占比的目标宽表
import pandas as pd # 1. 数据预处理 # 将提交日期转为纯日期格式,去掉时分秒,确保按天统计维度统一 # 若原字段已经是datetime类型可直接取dt.date,format参数按你实际数据的日期格式调整 df['Submission_Date'] = pd.to_datetime(df['Submission_Date'], format='%Y-%m-%d %H:%M:%S').dt.date # 过滤掉Flair为空的无效发帖数据 df = df.dropna(subset=['Flair']) # 2. 按日期+Flair分组统计发帖数 daily_flair_cnt = df.groupby(['Submission_Date', 'Flair'])['Post ID'].count().reset_index(name='post_count') # 3. 计算单日各Flair占比 # 先计算每日总发帖量,transform会自动对齐分组维度 daily_total_cnt = daily_flair_cnt.groupby('Submission_Date')['post_count'].transform('sum') # 占比保留2位小数,可根据需求调整精度 daily_flair_cnt['ratio'] = (daily_flair_cnt['post_count'] / daily_total_cnt * 100).round(2) # 4. 透视生成目标格式DataFrame result_df = daily_flair_cnt.pivot( index='Submission_Date', columns='Flair', values='ratio' ).fillna(0).reset_index() # 当日无对应Flair发帖的话占比填0
结果验证
你可以随机抽取result_df中任意一行的数值求和,总和会在100%附近,误差来自小数位保留逻辑,该结果可直接用于绘制多日期多分类100%堆叠柱状图。
内容的提问来源于stack exchange,提问作者reCaptcha
相关产品推荐
相关产品推荐

