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

如何将Pandas中列表类型列转换为字典并解析为多列?

解决Pandas列表列转字典并拆分为多列的问题

首先,咱们先搞定核心需求:把Size列里的单元素列表转成字典。你的Size列每个元素都是仅包含一个字典的列表,所以直接提取列表的第一个元素就能拿到目标字典。用apply处理整列比逐行循环高效太多:

# 将列表列转换为字典列,同时兼容空列表/异常情况
df['Size'] = df['Size'].apply(lambda x: x[0] if isinstance(x, list) and len(x) > 0 else {})

这行代码会遍历每一行的Size元素:如果是不为空的列表,就取第一个元素(也就是你要的字典);如果是空列表或其他异常类型,就返回空字典避免后续报错。

接下来是拆分字典为多列的环节——你的原代码用iterrows逐行循环的方式,在数据量大的时候性能会很差,咱们用Pandas原生的向量化操作来优化:

方法一:一键拆分字典列

# 将字典列拆分为独立列,并给列名加前缀
size_details = df['Size'].apply(pd.Series).add_prefix('Size_')
# 把拆分后的列合并回原DataFrame,同时删掉原Size列
df = pd.concat([df.drop('Size', axis=1), size_details], axis=1)

方法二:按需提取指定字段

如果只需要Name、Value、Unit这三个字段,也可以直接提取:

df['Size_Name'] = df['Size'].apply(lambda x: x.get('Name'))
df['Size_Value'] = df['Size'].apply(lambda x: x.get('Value'))
df['Size_Unit'] = df['Size'].apply(lambda x: x.get('Unit'))
# 不需要原Size列的话可以删掉
df = df.drop('Size', axis=1)

对你原代码的问题说明

你的循环代码里有几个小坑:

  • row['Size'][i]是错误的:row是当前行的Series,row['Size']已经是当前行的列表,应该用row['Size'][0]来取字典
  • 用type()判断类型不如isinstance()灵活,后者能处理类的继承关系,容错性更强
  • iterrows()在处理大数据集时性能拉胯,Pandas的向量化操作(比如apply、json_normalize)才是更优选择

如果你的字典结构非常规整,还可以用pd.json_normalize一步到位:

# 先提取列表里的字典,再直接归一化生成多列
df = pd.concat([
    df.drop('Size', axis=1),
    pd.json_normalize(df['Size'].apply(lambda x: x[0]))
], axis=1)
# 给列名加上前缀区分
df = df.rename(columns={'Name': 'Size_Name', 'Value': 'Size_Value', 'Unit': 'Size_Unit'})

这样整个流程既高效又简洁,完全满足你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:23:01