如何将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
相关产品推荐
相关产品推荐

