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

求助:将含列表值的字典展开为多行DataFrame的Python实现

问题:将DataFrame行中字典列表展开为多行

问题描述

我是Python新手,遇到以下问题无法解决,恳请帮助!

我有如下字典:

dict1 = {'id':1, 'col': 'b', 'item': [{'num': 111, 'value': 222},{'num': 333, 'value': 444}]}

我已掌握将'item'列表中第一个元素展开为DataFrame单行的方法,代码如下:

df = pd.DataFrame()
df = df.append(dict1, ignore_index=True)
item_detail = df.loc[0, 'item'][0]
for k, v in item_detail.items():
    df.loc[0, str("item_" + k)] = v

注:必须先将dict1转为DataFrame,因为dict1来自更大的字典,执行后结果为:

id  col item                                                  item_num item_value
0   1   b   [{'num': 111, 'value': 222}, {'num': 333, 'val...   111.0   222.0

但我期望得到如下结果:

id  col item                                                  item_num item_value
0   1   b   [{'num': 111, 'value': 222}, {'num': 333, 'val...   111.0   222.0
1   1   b   [{'num': 111, 'value': 222}, {'num': 333, 'val...   333.0   444.0

由于我的loc索引是循环遍历的,且有多个字典需要处理,无法直接手动指定行索引。请问如何将同一行中的字典列表展开为多行DataFrame?

补充:我不知道'item'列表中会包含多少个字典,若有4个字典,则希望展开为4行,每行保留相同的'id'和'col'值。

解决方案

方法1:使用explode + json_normalize(简洁高效)

这种方法利用Pandas内置函数,适合快速处理单个或批量数据:

import pandas as pd

# 按要求先将dict1转为DataFrame
df = pd.DataFrame([dict1])

# 1. 将item列的列表展开为多行,自动复制其他列的值
df_exploded = df.explode('item', ignore_index=True)

# 2. 将展开后的item字典转为列,并添加前缀区分
item_df = pd.json_normalize(df_exploded['item']).add_prefix('item_')

# 3. 合并基础列和展开的item列
result_df = pd.concat([df_exploded.drop('item', axis=1), item_df], axis=1)

# 若需要保留原始的item列表列,重新添加回去
result_df['item'] = df.loc[0, 'item']

print(result_df)

运行后会自动生成对应行数,无论item列表中有多少个字典。

方法2:循环遍历处理(灵活适配多场景)

如果需要处理包含多个类似字典的DataFrame,循环遍历每行的方式更直观,也便于自定义逻辑:

import pandas as pd

# 示例:多个待处理的字典组成的列表
dict_list = [
    {'id':1, 'col': 'b', 'item': [{'num': 111, 'value': 222},{'num': 333, 'value': 444}]},
    {'id':2, 'col': 'c', 'item': [{'num': 555, 'value': 666},{'num': 777, 'value': 888},{'num':999, 'value':1010}]}
]

# 按要求先转为DataFrame
df = pd.DataFrame(dict_list)

result_rows = []

# 遍历每一行数据
for _, row in df.iterrows():
    # 提取当前行的基础信息(id、col、原始item列表)
    base_info = {
        'id': row['id'],
        'col': row['col'],
        'item': row['item']
    }
    # 遍历item列表中的每个字典,生成新行
    for item_dict in row['item']:
        new_row = base_info.copy()
        # 将item字典的键添加前缀后合并到新行
        new_row.update({f'item_{k}': v for k, v in item_dict.items()})
        result_rows.append(new_row)

# 转换为最终的DataFrame
result_df = pd.DataFrame(result_rows)
print(result_df)

这个方法可以轻松适配不同长度的item列表,且保留所有需要的字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:01:00