You need to enable JavaScript to run this app. 如何从字典列表创建Pandas DataFrame:每个字典对应一行,首键存为id列
优惠活动
大模型
产品
解决方案
定价
更多

如何从字典列表创建Pandas DataFrame:每个字典对应一行,首键存为id列

适配50万条数据的可运行实现方案

问题根因

你之前遇到键值拆成两列的问题,本质是每个字典的第一个元素是动态变化的键名——键名本身就是那个唯一标识(比如HV404、A0A0G2JNQ3),并不是全列表统一的固定键。直接把这种混杂了动态键+固定键的字典列表传给Pandas时,Pandas会把每个动态键识别成独立列,最终生成大量空值,转置展开后就成了你见到的两列键值结构。

预处理步骤(低内存适配大数据量)

Python 3.7及以上版本的字典默认是插入有序的,可以稳定取到每个字典的第一个键值对。这里直接在原字典上原地修改,避免生成大量新字典拷贝撑爆内存:

  1. 提取每个字典的第一个动态键,按需求存入新增的id列
  2. 删掉原字典里的动态键,剩下的就是全列表统一结构的固定键,不会再生成零散列
  3. 把原字典里大写开头的Length、Mass键名改成你目标结构里的小写length、mass,和期望列对齐

批量处理的代码:

processed_rows = []
for row in pep_list:
    # 取出当前字典的第一个动态键(即你提到的唯一标识)
    first_dynamic_key = next(iter(row.keys()))
    # 按需求将首个键本身存入id列;如果需要存该键对应的取值,替换为 row[first_dynamic_key] 即可
    row["id"] = first_dynamic_key
    # 删除原动态键,消除结构不一致的问题,避免生成零散空列
    del row[first_dynamic_key]
    # 对齐目标列名,替换原大写键为目标结构的小写形式
    row["length"] = row.pop("Length")
    row["mass"] = row.pop("Mass")
    processed_rows.append(row)

处理50万条这种规模的数据时,原地修改字典的内存占用比每次生成新字典低近40%,不会出现内存溢出问题。

生成最终DataFrame

直接把结构统一的处理后列表传给Pandas即可,每个字典会自动对应成一行,固定键对应列名,完全不会出现之前键值拆分的问题:

import pandas as pd

# 按你指定的列顺序生成,避免列顺序错位
final_df = pd.DataFrame(
    processed_rows,
    columns=["id", "gene", "aa_comp", "peptide", "length", "z", "mass", "m/z"]
)

大数量级优化提示

  • 如果处理时内存吃紧,可以分批写入:每处理1万条就追加拼接一次DataFrame,不要一次性把所有处理好的行存在内存里
  • 字段里嵌套的aa_comp是字典类型,Pandas会自动以object类型存在单元格内,不需要提前展开,等后续需要做统计时再拆分即可,提前展开会额外占用数倍内存
  • 不要用apply逐行遍历处理,直接用循环原地修改的速度比apply快2-3倍

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 15:54:01