如何合理可视化Python中含部门组合与计数的DataFrame?
部门协作组合可视化方案
针对你拥有的含大量组合(含近半数0计数)的DataFrame,以下是几种用Plotly实现的实用可视化方案:
1. 聚焦高价值协作:Top N组合条形图
先过滤掉计数为0的无效组合,再选取计数最高的Top N组合绘制条形图,清晰展示最频繁的协作模式。
import plotly.express as px import pandas as pd # 假设你的DataFrame名为df # 过滤计数>0的行,按计数降序取前20 top_combinations = df[df['计数'] > 0].sort_values('计数', ascending=False).head(20) # 绘制条形图 fig = px.bar(top_combinations, x='组合', y='计数', title='Top 20 高频部门协作组合', color='计数', color_continuous_scale='Blues') fig.update_layout(xaxis_tickangle=-45) # 旋转x轴标签避免重叠 fig.show()
2. 部门关联网络图:展示全局协作关系
忽略组合的复杂结构,统计所有两两部门的协作总次数(比如A和B不管是单独协作还是和其他部门一起协作,都累加次数),用网络图直观展示部门间的关联强度。
import plotly.graph_objects as go from itertools import combinations import pandas as pd # 1. 预处理:拆分组合,生成所有两两无序部门对 pair_counts = {} for idx, row in df.iterrows(): if row['计数'] == 0: continue # 拆分组合并去重(避免重复部门影响统计) depts = list(set(row['组合'].split(','))) # 生成所有两两组合 for pair in combinations(sorted(depts), 2): pair_key = ','.join(pair) pair_counts[pair_key] = pair_counts.get(pair_key, 0) + row['计数'] # 转换为DataFrame pair_df = pd.DataFrame([(k.split(',')[0], k.split(',')[1], v) for k, v in pair_counts.items()], columns=['部门1', '部门2', '总协作次数']) # 2. 绘制网络图 fig = go.Figure() # 添加节点:所有唯一部门 all_depts = list(set(pair_df['部门1'].tolist() + pair_df['部门2'].tolist())) node_x = [] node_y = [] node_text = [] for i, dept in enumerate(all_depts): node_x.append(i % 7) node_y.append(i // 7) node_text.append(dept) fig.add_trace(go.Scatter( x=node_x, y=node_y, mode='markers+text', text=node_text, marker=dict(size=20, color='lightblue'), textposition='top center' )) # 添加边:根据协作次数设置粗细 for _, row in pair_df.iterrows(): idx1 = all_depts.index(row['部门1']) idx2 = all_depts.index(row['部门2']) fig.add_trace(go.Scatter( x=[node_x[idx1], node_x[idx2]], y=[node_y[idx1], node_y[idx2]], mode='lines', line=dict(width=row['总协作次数']/10, color='gray'), hoverinfo='text', text=f"{row['部门1']}-{row['部门2']}: {row['总协作次数']}次" )) fig.update_layout(title='部门间协作关联网络图', showlegend=False) fig.show()
3. 组合规模分析:组合长度与计数分布
新增“组合长度”列(统计每个组合中不同部门的数量),用箱线图展示不同规模组合的协作次数分布,分析多部门协作的效率特征。
import plotly.express as px import pandas as pd # 新增组合长度列(去重后的部门数量) df['组合长度'] = df['组合'].apply(lambda x: len(set(x.split(',')))) # 过滤计数>0的行(避免0值干扰分布) filtered_df = df[df['计数'] > 0] # 绘制箱线图 fig = px.box(filtered_df, x='组合长度', y='计数', title='不同规模部门组合的协作次数分布', color='组合长度', labels={'计数':'协作次数', '组合长度':'组合中不同部门数量'}) fig.show()
4. 变通热力图:两两部门协作矩阵
如果仍想使用热力图,可聚焦两两部门的总协作次数,构建14x14的部门关联矩阵,既保留热图的直观性,又避免组合过多的问题。
import plotly.express as px import pandas as pd from itertools import combinations # 复用之前的pair_df数据 # 构建透视矩阵 heatmap_df = pair_df.pivot(index='部门1', columns='部门2', values='总协作次数').fillna(0) # 补全对称项(因为A-B和B-A是同一协作) for dept1 in heatmap_df.index: for dept2 in heatmap_df.columns: if pd.isna(heatmap_df.loc[dept1, dept2]): heatmap_df.loc[dept1, dept2] = heatmap_df.loc[dept2, dept1] # 绘制热力图 fig = px.imshow(heatmap_df, title='部门两两协作次数热力图', labels=dict(x='部门', y='部门', color='总协作次数'), x=heatmap_df.columns, y=heatmap_df.index, color_continuous_scale='Reds') fig.show()
内容的提问来源于stack exchange,提问作者hvahva
相关产品推荐
相关产品推荐

