如何从DataFrame的重复嵌套子段数据中提取内容创建新DataFrame
问题描述
- 正在准备模型训练所用数据集,原始数据为YAML格式,目前已完成格式转换,成功将数据加载为DataFrame
- 现存问题:数据内的有效信息以嵌套子段形式存储,无法通过常规列访问方式直接读取
- 需求:提取包含3个嵌套子段的目标列,基于该部分有效数据创建新的可用DataFrame
- 数据集头部样例:

解决方案
YAML转换得到的DataFrame中,嵌套子段一般以字典格式存储在单元格内,按以下两种场景选择处理方式即可:
场景1:嵌套列无缺失值、结构统一
直接用apply(pd.Series)拆分嵌套字典为独立列,效率最高,示例代码:
import pandas as pd import yaml # 替换为你的原始DataFrame变量名、目标嵌套列名 raw_df = "你的原始DataFrame" target_col = "存储3个嵌套子段的目标列名" # 若列内容为YAML字符串格式,先执行这一步做格式转换 # raw_df[target_col] = raw_df[target_col].apply(yaml.safe_load) # 拆分嵌套列为独立子列 split_cols = raw_df[target_col].apply(pd.Series) # 按实际子段名称重命名列 split_cols.columns = ["子段1名称", "子段2名称", "子段3名称"] # 拼接需要保留的其他列,生成最终训练用DataFrame # 不需要保留其他列的话直接 new_train_df = split_cols 即可 new_train_df = pd.concat( [raw_df[["需要保留的非嵌套列1", "需要保留的非嵌套列2"]], split_cols], axis=1 )
场景2:嵌套列存在缺失值、子段结构不完全一致
用pandas内置的json_normalize方法做展开,容错性更强,不会因为个别行缺字段直接报错:
import pandas as pd import yaml from pandas import json_normalize raw_df = "你的原始DataFrame" target_col = "存储3个嵌套子段的目标列名" # 若列内容为YAML字符串格式,先执行这一步做格式转换 # raw_df[target_col] = raw_df[target_col].apply(yaml.safe_load) # 自动展开所有嵌套字段为独立列 expanded_df = json_normalize(raw_df[target_col]) # 筛选需要的3个子段,和其他保留列拼接得到最终DF new_train_df = pd.concat( [raw_df.drop(columns=[target_col]), expanded_df[["子段1名称", "子段2名称", "子段3名称"]]], axis=1 )
踩坑提示:不要用
eval做字符串转字典的操作,存在执行恶意代码的风险,处理YAML格式数据优先用yaml.safe_load做解析。
内容的提问来源于stack exchange,提问作者Angelos Zinonos
相关产品推荐
相关产品推荐

