You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按pandas DataFrame分类列唯一值生成Plotly折线图并实现条件过滤

实现方案

最简实现(无需提前存储子数据集字典)

直接遍历groupby返回的迭代对象即可,无需额外生成字典存储子数据集,内存占用更低:

import pandas as pd
import plotly.graph_objects as go

# 提前将Date列转为时间类型,避免X轴显示异常
df['Date'] = pd.to_datetime(df['Date'])

# 遍历分类分组
for category, group_df in df.groupby('Category'):
    # 👇 判断条件可根据实际业务调整,示例为当前分类Number列总和超过全表Y列总和的25%
    if group_df['Number'].sum() > df['Y'].sum() * 0.25:
        # 生成单类别折线图
        fig = go.Figure()
        fig.add_trace(go.Scatter(
            x=group_df['Date'],
            y=group_df['Number'],
            mode='lines',
            name=category
        ))
        fig.update_layout(
            title=f'类别{category}数值趋势',
            xaxis_title='日期',
            yaxis_title='Number数值'
        )
        # 可选择直接展示或保存图表
        fig.show()
        # fig.write_html(f"./{category}_趋势图.html")

合并为单张图表的实现

如果确认图表不杂乱需要合并,只需把图表初始化逻辑移到循环外即可:

import pandas as pd
import plotly.graph_objects as go

df['Date'] = pd.to_datetime(df['Date'])
fig = go.Figure()

for category, group_df in df.groupby('Category'):
    if group_df['Number'].sum() > df['Y'].sum() * 0.25:
        fig.add_trace(go.Scatter(
            x=group_df['Date'],
            y=group_df['Number'],
            mode='lines',
            name=category
        ))

fig.update_layout(
    title='全类别数值趋势对比',
    xaxis_title='日期',
    yaxis_title='Number数值'
)
fig.show()

已有思路的补充说明

  • 你最早用unique取唯一值的思路没有错误,只是实现效率低于直接遍历groupby,写法如下:
    for category in df['Category'].unique():
        group_df = df[df['Category'] == category]
        # 后续绘图逻辑和上文完全一致
    
  • 你已经生成的子数据集字典也可以直接遍历使用,写法为for category, group_df in df1.items(),后续逻辑和遍历groupby完全一致,只是额外占用了内存存储所有子数据集,数据量大时不推荐。

注:判断条件可根据业务需求灵活调整,比如替换为group_df['Number'].max()、group_df['Number'].mean()等统计指标,阈值也可按需修改

内容的提问来源于stack exchange,提问作者Kartöfluvofan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:54:03