如何自动计算Pandas层级节点流量值并生成Plotly Sankey图表
自动计算层级关联频次生成Plotly Sankey图表
你的核心问题是误将节点值当作DataFrame列名来操作,导致KeyError。下面是完整的解决方案,能自动统计l1-l2、l2-l3的节点关联频次,生成Sankey图表:
步骤1:导入依赖并读取数据
import pandas as pd import plotly.graph_objects as go # 读取测试数据 df = pd.read_csv('stack.csv')
步骤2:构建节点映射与关联数据
首先收集所有层级的唯一节点,给每个节点分配唯一数字ID(Plotly Sankey要求用数字索引而非节点名称);然后统计相邻层级的父-子节点组合频次:
# 收集所有层级的节点并去重,生成节点到ID的映射 all_nodes = [] for col in df.columns: all_nodes.extend(df[col].unique()) node_map = {node: idx for idx, node in enumerate(pd.unique(all_nodes))} # 初始化Sankey所需的source、target、value列表 sources = [] targets = [] values = [] # 遍历每一组相邻层级(l1-l2、l2-l3) for i in range(len(df.columns) - 1): parent_col = df.columns[i] child_col = df.columns[i+1] # 统计父节点-子节点组合的出现频次 connection_counts = df.groupby([parent_col, child_col]).size().reset_index(name='count') # 将组合转换为Sankey要求的格式 for _, row in connection_counts.iterrows(): sources.append(node_map[row[parent_col]]) targets.append(node_map[row[child_col]]) values.append(row['count'])
步骤3:生成并展示Sankey图表
fig = go.Figure(data=[go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=list(node_map.keys()) # 显示节点名称 ), link=dict( source=sources, target=targets, value=values ) )]) fig.update_layout(title_text="层级关联 Sankey 图", font_size=10) fig.show()
错误原因说明
你之前遇到的KeyError是因为错误地把节点值(如'D'、'E')当成DataFrame的列名来访问,但这些值其实是列中的内容。正确的统计方式是用groupby([父列, 子列]).size(),直接得到每对父-子节点的关联频次。
额外说明
- 这段代码支持任意数量的连续层级列(不限于3层),只要列按层级顺序排列即可
- 节点映射自动处理重复节点,确保每个唯一节点只对应一个ID
- 统计逻辑完全自动化,无需手动维护value列
内容的提问来源于stack exchange,提问作者twelsh37
相关产品推荐
相关产品推荐

