如何基于非空值透视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)
逻辑说明
- 遍历每行数据:逐个处理原始DataFrame的每一行记录
- 提取有效节点序列:取出当前行的层级列(l0到l3),过滤掉缺失值后得到按顺序排列的节点路径
- 生成数据流对:对每个有效路径,依次取相邻的两个节点作为
source和target,绑定当前行的sum值 - 组合结果:将所有生成的数据流对整合为新的DataFrame,得到最终输出
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

