两次遍历dataframe生成桑基图数据源,是否有更高效的实现方式?
桑基图数据转换优化方案
核心思路为使用pandas向量化运算替代双层循环,时间复杂度从O(n²)降低至O(n),适合处理大数据量场景。
核心实现逻辑
- 按
ID字段分组,对flow列执行向下位移操作,直接获取每个节点对应的下一级节点作为初始Destination - 特殊规则处理:将
flow为final point c的行的Destination统一替换为end - 空值处理:将每个ID最后一行无下一级节点的Destination填充为空字符串
- 字段重命名:将原
flow字段重命名为Source
完整代码示例
import pandas as pd # 原始数据构造(实际使用时替换为你自己的df读取逻辑即可) data = { "ID": [1,1,1,2,2,3,3,3], "flow": ["Starting a", "next point b", "final point c", "Starting a", "next point b", "Starting a", "next point b", "final point c"] } df = pd.DataFrame(data) # 核心处理代码 # 若原始数据未按ID+流程顺序排序,先执行排序:df = df.sort_values(["ID", "你的顺序字段名"]) df["Destination"] = df.groupby("ID")["flow"].shift(-1) df.loc[df["flow"] == "final point c", "Destination"] = "end" df["Destination"] = df["Destination"].fillna("") df = df.rename(columns={"flow": "Source"}) # 输出结果验证 print(df)
输出结果匹配要求
| ID | Source | Destination |
|---|---|---|
| 1 | Starting a | next point b |
| 1 | next point b | final point c |
| 1 | final point c | end |
| 2 | Starting a | next point b |
| 2 | next point b | |
| 3 | Starting a | next point b |
| 3 | next point b | final point c |
| 3 | final point c | end |
内容的提问来源于stack exchange,提问作者Rach
相关产品推荐
相关产品推荐

