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()
逻辑说明:
groupby('name'):按name列对数据分组,相同名字的行归为一组apply(...):对每组数据执行转换——将组内的subject设为索引,再将marks列转为以subject为键的字典- 外层
to_dict():将分组后的结果转为最终的嵌套字典
方法二:Groupby + Agg(简洁写法)
如果追求代码简洁,也可以用agg方法实现:
result = df.groupby('name').agg(lambda group: dict(zip(group['subject'], group['marks']))).to_dict()['marks']
逻辑说明:
agg(lambda group: ...):对每组数据,直接用zip把subject和marks配对成字典- 最后提取
marks列并转为字典,得到目标结构
性能对比
- 当数据量超过10万行时,方法一的执行效率明显高于方法二,因为
set_index是Pandas底层优化的操作,比手动zip配对更快 - 小数据量下两种方法差异不大,可根据代码可读性选择
内容的提问来源于stack exchange,提问作者Kingston X
相关产品推荐
相关产品推荐

