求助:将含列表值的字典展开为多行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
相关产品推荐
相关产品推荐

