如何解析Python DataFrame中字典列表类型的列并重构表格
解决方案:展开DataFrame嵌套字典列表并合并到原表
问题场景
现有如下结构的DataFrame:
| id | name | describe |
|---|---|---|
| 1 | some | [{'id':20, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'},{'id':22, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}] |
| 2 | some2 | [{'id':23, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'},{'id':24, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}] |
需要将其重构为:
| id | name | thisIwantAsNameColumn | thisIwantAsNameColumn2 |
|---|---|---|---|
| 1 | some | thisIwantasValueinRow | thisIwantasValueinRow2 |
| 2 | some2 | thisIwantasValueinRow | thisIwantasValueinRow2 |
原函数每次生成独立小DataFrame,导致后续合并困难,以下是两种高效解决方案:
方法一:apply+Series直接生成列并合并
直接将describe列的每个字典列表转换为Series,通过join快速合并到原表,自动对齐索引:
import pandas as pd # 构造示例数据 data = { 'id': [1, 2], 'name': ['some', 'some2'], 'describe': [ [{'id':20, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'}, {'id':22, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}], [{'id':23, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'}, {'id':24, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}] ] } df = pd.DataFrame(data) # 处理函数:将字典列表转为{字段名: 字段值}的Series def parse_describe(row): return pd.Series({item['name']: item['value'] for item in row}) # 生成扩展列并合并,删除原describe列 result_df = df.join(df['describe'].apply(parse_describe)).drop('describe', axis=1) print(result_df)
方法二:explode+pivot(适配复杂场景)
如果数据量较大或嵌套结构存在差异,可通过拆分行再转列的方式处理,保留原表关联键确保合并准确:
import pandas as pd # 构造示例数据(同方法一) data = { 'id': [1, 2], 'name': ['some', 'some2'], 'describe': [ [{'id':20, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'}, {'id':22, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}], [{'id':23, 'name':'thisIwantAsNameColumn','value':'thisIwantasValueinRow'}, {'id':24, 'name':'thisIwantAsNameColumn2','value':'thisIwantasValueinRow2'}] ] } df = pd.DataFrame(data) # 拆分describe列表为单行,展开字典为列 temp_df = df[['id', 'name']].join(df['describe'].explode().apply(pd.Series)) # 按原表主键转列,恢复结构 result_df = temp_df.pivot(index=['id', 'name'], columns='name', values='value').reset_index() # 清理列名层级 result_df.columns = result_df.columns.get_level_values(0) print(result_df)
原函数问题说明
原函数每次返回独立的小DataFrame,后续合并需手动处理索引对齐,而上述两种方法要么通过join自动对齐,要么保留原表主键确保结构匹配,避免了合并难题。
内容的提问来源于stack exchange,提问作者Cesc
相关产品推荐
相关产品推荐

