如何拆分DataFrame字典列表列并完成melting数据重塑
Pandas实现字典列表列拆分+字典展开+宽长表转换
现有一张数据表,其中某一列存储由字典(dictionary)组成的列表(list)。需要先将该字典列表拆分,使列表内的每个字典单独占据一列;后续再将字典内容展开为对应独立列,同时对DataFrame执行melting(宽表转长表)重塑操作,具体实现按步骤拆分如下:
步骤1:拆分字典列表,每个字典单独占一列
先将存储字典列表的目标列按列表顺序拆分,每个位置的字典生成单独的新列,和原表其他非目标列横向拼接。
对应实现代码:
import pandas as pd # 构造和示例结构一致的测试数据 df = pd.DataFrame({ 'id': [1, 2], 'target_col': [ [{'name':'A', 'score':90}, {'name':'B', 'score':85}], [{'name':'C', 'score':95}, {'name':'D', 'score':88}] ] }) # 拆分列表为多列 step1 = pd.concat( [df.drop('target_col', axis=1), df['target_col'].apply(pd.Series).add_prefix('temp_')], axis=1 )
步骤2:展开字典内容为独立列
遍历步骤1生成的所有临时字典列,将每个字典的键拆分为独立字段,保留对应值。
对应实现代码:
step2 = step1.copy() # 遍历所有存储字典的临时列 for col in step2.columns[step2.columns.str.startswith('temp_')]: # 拆分字典为独立列,添加对应前缀 dict_cols = step2[col].apply(pd.Series).add_prefix(f'{col}_') step2 = pd.concat([step2.drop(col, axis=1), dict_cols], axis=1)
步骤3:melt宽表转长表,输出最终结果
对展开后的宽表做重塑,将所有临时字段列转为长表格式,拆分得到列表索引、字典字段名后整理为最终结构化输出。
对应实现代码:
# 宽表转长表 melt_df = step2.melt( id_vars=['id'], var_name='col_name', value_name='value' ) # 拆分临时列名,提取列表位置索引、字典字段名 melt_df[['_', 'list_idx', 'field']] = melt_df['col_name'].str.split('_', expand=True) # 透视得到最终字段 final_df = melt_df.pivot( index=['id', 'list_idx'], columns='field', values='value' ).reset_index().drop('_', axis=1)
高效简化写法
如果不需要保留三步拆分的中间结果,可以直接用explode+json_normalize实现,代码更简洁、运行性能更好,输出结果和分步操作完全一致:
# 展开列表为独立行 explode_df = df.explode('target_col').reset_index(drop=True) # 结构化字典内容 final_df = pd.concat( [explode_df.drop('target_col', axis=1), pd.json_normalize(explode_df['target_col'])], axis=1 )
内容的提问来源于stack exchange,提问作者Pooja Bhateley
相关产品推荐
相关产品推荐

