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

如何自动计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:00:58