Python将含必填可选字段的嵌套列表转换为pandas DataFrame
嵌套列表转结构化产品DataFrame实现
字段规则
涉及三个产品字段:
LineNumber:必填,行号ManufacturersProductId:必填,厂商产品IDInternationalProductClassCode:可选,国际产品分类编码
原始输入为按顺序存储字段键值对的嵌套列表,直接使用pd.DataFrame(data)会生成仅包含键、值两列的长表,无法实现每行对应一条完整产品记录的需求。
实现思路
每条产品记录均以LineNumber字段作为起始标记,遍历原始键值对列表时,遇到LineNumber即初始化新的产品记录,后续遍历到的同组字段全部追加到当前记录,直到下一个LineNumber出现,最终将整理完成的记录列表传入pandas生成DataFrame即可,可选字段缺失时会自动填充为空值。
完整代码
import pandas as pd # 原始嵌套列表数据 data = [['LineNumber', '1'], ['ManufacturersProductId', '7000000142'], ['LineNumber', '2'], ['ManufacturersProductId', '7000000144'], ['LineNumber', '3'], ['ManufacturersProductId', '7000000145'], ['LineNumber', '4'], ['ManufacturersProductId', '7000000147'], ['LineNumber', '5'], ['ManufacturersProductId', '7000000149'], ['LineNumber', '6'], ['ManufacturersProductId', '7000000151'], ['LineNumber', '7'], ['ManufacturersProductId', '7000000157'], ['InternationalProductClassCode', 'EC012017'], ['LineNumber', '8'], ['ManufacturersProductId', '7000000158'], ['InternationalProductClassCode', 'EC012017'], ['LineNumber', '9'], ['ManufacturersProductId', '7000000159'], ['InternationalProductClassCode', 'EC012017'], ['LineNumber', '10'], ['ManufacturersProductId', '7000000182'], ['InternationalProductClassCode', 'EC011984'], ['LineNumber', '11'], ['ManufacturersProductId', '7000000208'], ['InternationalProductClassCode', 'EC011098'], ['LineNumber', '12'], ['ManufacturersProductId', '7000000214'], ['InternationalProductClassCode', 'EC011098'], ['LineNumber', '13'], ['ManufacturersProductId', '7000000215'], ['InternationalProductClassCode', 'EC011098'], ['LineNumber', '14'], ['ManufacturersProductId', '7000000216'], ['InternationalProductClassCode', 'EC011098']] records = [] current_prod = {} for field, val in data: # 检测到行号字段,说明开始一条新产品记录 if field == 'LineNumber': if current_prod: records.append(current_prod) current_prod = {field: val} else: current_prod[field] = val # 追加最后一条产品记录 records.append(current_prod) # 生成DataFrame df = pd.DataFrame(records) # 按需调整数据类型,比如把行号转为整数 df['LineNumber'] = df['LineNumber'].astype(int) # 如需固定列顺序,可执行下方代码 # df = df[['LineNumber', 'ManufacturersProductId', 'InternationalProductClassCode']]
输出效果
最终生成的DataFrame共14行,对应14条产品记录:
- 前6条无分类编码的产品,
InternationalProductClassCode列自动填充为空值 - 后续带分类编码的产品会正确匹配对应编码值
- 可通过列重排代码固定三列的展示顺序,完全匹配结构化表需求。
内容的提问来源于stack exchange,提问作者HeadOverFeet
相关产品推荐
相关产品推荐

