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

如何基于非空值透视Pandas DataFrame生成直接数据流表

Pandas DataFrame转换:提取源到目标的直接数据流

问题描述

需要将如下结构的Pandas DataFrame进行转换,提取出每一行中直接的源(source)到目标(target)的数据流关系,同时保留对应的sum值:

原始DataFrame:

l0      l1      l2      l3      sum
0   IN      TOTAL   <NA>    <NA>    1
1   <NA>    TOTAL   OUT_A   OUT_B   2
2   <NA>    TOTAL   <NA>    OUT_C   3

数据流规则:

  • 第0行:IN(l0)→ TOTAL(l1)为一条直接数据流
  • 第1行:TOTAL(l1)→ OUT_A(l2)、OUT_A(l2)→ OUT_B(l3)为两条直接数据流
  • 第2行:TOTAL(l1)→ OUT_C(l3)为一条直接数据流

期望输出:

source  target  sum
0   IN      TOTAL   1
1   TOTAL   OUT_A   2
2   TOTAL   OUT_C   3
3   OUT_A   OUT_B   2

解决方案代码

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    "l0": ['IN', pd.NA, pd.NA],
    "l1": ['TOTAL','TOTAL','TOTAL'],
    "l2": [pd.NA,'OUT_A', pd.NA],
    "l3": [pd.NA,'OUT_B',"OUT_C"],
    "sum": [1,2,3]
})

# 提取直接数据流关系
result_rows = []
for idx, row in df.iterrows():
    # 过滤当前行l0-l3列的缺失值,得到有序节点序列
    path = row[['l0', 'l1', 'l2', 'l3']].dropna().tolist()
    # 生成相邻节点的source-target对
    for i in range(len(path)-1):
        result_rows.append({
            'source': path[i],
            'target': path[i+1],
            'sum': row['sum']
        })

# 转换为结果DataFrame
result_df = pd.DataFrame(result_rows)
print(result_df)

逻辑说明

  1. 遍历每行数据:逐个处理原始DataFrame的每一行记录
  2. 提取有效节点序列:取出当前行的层级列(l0到l3),过滤掉缺失值后得到按顺序排列的节点路径
  3. 生成数据流对:对每个有效路径,依次取相邻的两个节点作为source和target,绑定当前行的sum值
  4. 组合结果:将所有生成的数据流对整合为新的DataFrame,得到最终输出

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:45:21