按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
相关产品推荐
相关产品推荐

