如何按月统计多color列的颜色频率与占比以制作折线图
多color列月度颜色频率与占比统计实现方案
实现步骤(基于Python Pandas)
1. 导入依赖并加载原始数据
import pandas as pd import numpy as np # 构造示例数据,实际使用时可替换为pd.read_csv等读取自己的文件 data = { 'ID': [55, 67, 83, 78, 43, 29], 'color': ['red', 'yellow', 'blue', 'red', 'green', 'yellow'], 'color2': ['blue', np.nan, 'yellow', 'yellow', np.nan, 'green'], 'color3': [np.nan, np.nan, np.nan, 'blue', np.nan, np.nan], 'date': ['2020-03-15', '2020-05-02', '2020-05-17', '2020-12-15', '2021-01-27', '2021-01-03'] } df = pd.DataFrame(data) # 日期列转时间格式 df['date'] = pd.to_datetime(df['date'])
2. 宽表转长表,消除多color列影响
# 生成标准月份字段,格式为mm-YYYY df['Month'] = df['date'].dt.strftime('%m-%Y') # 把3列color字段转为长格式,剔除空值 df_long = df.melt( id_vars=['ID', 'Month'], value_vars=['color', 'color2', 'color3'], value_name='color' ).dropna(subset=['color'])
3. 按月统计频率、占比,补全缺失月份
# 统计每月各颜色出现次数 freq_df = df_long.groupby(['Month', 'color'])['color'].count()\ .unstack(fill_value=0)\ .add_prefix('freq_') # 生成时间范围内所有完整月份,补全无数据的月份 all_months = pd.date_range( start=df['date'].min(), end=df['date'].max(), freq='MS' ).strftime('%m-%Y') freq_df = freq_df.reindex(all_months, fill_value=0) # 计算各颜色月度占比,保留1位小数 month_total = freq_df.sum(axis=1) pct_df = freq_df.div(month_total, axis=0)\ .multiply(100)\ .round(1)\ .fillna(0)\ .rename(columns=lambda x: x.replace('freq_', '%_')) # 合并频率和占比得到最终结果 result = pd.concat([freq_df, pct_df], axis=1).reset_index()
后续使用
输出的result完全匹配你需要的目标格式,直接提取%_开头的字段即可绘制对应颜色的月度占比折线图。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

