pandas如何将含关系列的DataFrame转换为源-目标实体对结构
实现方案
可以直接通过pandas原生的melt+explode组合实现需求,处理效率高,适配你的所有输入场景,代码如下:
import numpy as np import pandas as pd # 构造示例输入 i = [['a', np.nan, np.nan, ['d', 'e']], ['b', 'f', np.nan, np.nan], ['c', np.nan, 'g', 'h']] inputs = pd.DataFrame(i, columns=['source', 'mom', 'dad', 'sibling']) # 核心处理逻辑 # 1. 宽表转长表,删除目标为空的无效行 df_long = inputs.melt( id_vars='source', value_vars=['mom', 'dad', 'sibling'], var_name='relation', value_name='target' ).dropna(subset='target') # 2. 统一将目标值转为列表格式,避免单个字符串被explode拆分为单个字符 df_long['target'] = df_long['target'].apply(lambda x: x if isinstance(x, list) else [x]) # 3. 展开列表为单独行,重置索引得到最终结果 output = df_long.explode('target').reset_index(drop=True) print(output)
运行后输出结果为:
source relation target 0 b mom f 1 c dad g 2 a sibling d 3 a sibling e 4 c sibling h
你给出的示例输出里最后一行的sib属于笔误,实际输出会保留原关系名sibling,如果需要自定义关系名映射,额外对relation列做一次replace处理即可。
如果你的pandas版本低于1.3,可升级到最新稳定版获得最佳的explode兼容性。
内容的提问来源于stack exchange,提问作者newcoder248
相关产品推荐
相关产品推荐

