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

Pandas DataFrame列转字典:按列分组构建双列映射字典的最优方法

Pandas DataFrame按列分组构建嵌套字典的最优方法

示例数据

先定义示例DataFrame:

import pandas as pd

data = {
    "name": ["king", "king", "king", "queen", "queen", "queen", "jack", "jack", "jack"],
    "subject": ["maths", "science", "english", "maths", "science", "english", "maths", "science", "english"],
    "marks": ["100", "93", "98", "88", "76", "90", "77", "56", "92"]
}
df = pd.DataFrame(data)

预期输出

我们需要将上述DataFrame转换为以下嵌套字典:

{
    'king': {'maths': '100', 'science': '93', 'english': '98'},
    'queen': {'maths': '88', 'science': '76', 'english': '90'},
    'jack': {'maths': '77', 'science': '56', 'english': '92'}
}

最优实现方式

方法一:Groupby + Apply + Set_index(高效首选)

这是数据量较大时的最优方案,利用Pandas内部优化的API实现:

result = df.groupby('name').apply(lambda group: group.set_index('subject')['marks'].to_dict()).to_dict()

逻辑说明:

  1. groupby('name'):按name列对数据分组,相同名字的行归为一组
  2. apply(...):对每组数据执行转换——将组内的subject设为索引,再将marks列转为以subject为键的字典
  3. 外层to_dict():将分组后的结果转为最终的嵌套字典

方法二:Groupby + Agg(简洁写法)

如果追求代码简洁,也可以用agg方法实现:

result = df.groupby('name').agg(lambda group: dict(zip(group['subject'], group['marks']))).to_dict()['marks']

逻辑说明:

  1. agg(lambda group: ...):对每组数据,直接用zip把subject和marks配对成字典
  2. 最后提取marks列并转为字典,得到目标结构

性能对比

  • 当数据量超过10万行时,方法一的执行效率明显高于方法二,因为set_index是Pandas底层优化的操作,比手动zip配对更快
  • 小数据量下两种方法差异不大,可根据代码可读性选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:37:54