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

如何用更优雅的方式将DataFrame转换为元组键的字典?

更优雅的方式将Pandas DataFrame转换为元组键字典

问题背景

现有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({
    'DATE' : [1,2,3,4,5],
    'Q24' : [23.28, 28.81, 29.32, 29.8, 30.25],
    'J24' : [24.22, 24.89, 25.54, 26.15, 26.73],
    'F24' : [22.34, 32.73, 33.1, 33.45, 33.77]
})

需要创建一个字典,所有键为df['DATE']的值与df.columns[1:]元素的笛卡尔积组成的元组,对应值为DataFrame中的相应数据。当前实现代码较为繁琐,希望得到更优雅的写法。

优雅实现方法

方法1:stack极简写法

这是最简洁的Pandas原生方案,利用索引重塑直接生成目标结构:

result = df.set_index('DATE').stack().to_dict()
  • set_index('DATE'):将DATE设为行索引
  • stack():把列名转为二级索引,同时将对应值平铺,形成(DATE, 列名)的复合索引结构
  • to_dict():直接将复合索引作为键、对应值作为值生成目标字典

方法2:melt+set_index方案

适合需要明确中间步骤的场景,逻辑更直观:

result = df.melt(id_vars='DATE', var_name='CODE', value_name='VALUE')\
           .set_index(['DATE', 'CODE'])['VALUE'].to_dict()
  • melt:将宽表转为长表,把Q24/J24/F24列转为CODE列的取值,对应值存入VALUE列
  • set_index:把DATE和CODE设为复合索引
  • to_dict:直接转换为目标字典

方法3:纯Python生成器表达式

不依赖Pandas高级方法时的简洁写法:

result = {(row['DATE'], col): row[col] for _, row in df.iterrows() for col in df.columns[1:]}

通过遍历每一行与目标列,直接生成键值对,代码简洁易读。

验证结果

以上三种方法生成的结果均与预期一致:

{(1, 'Q24'): 23.28,(1, 'J24'): 24.22,(1, 'F24'): 22.34,
 (2, 'Q24'): 28.81,(2, 'J24'): 24.89,(2, 'F24'): 32.73,
 (3, 'Q24'): 29.32,(3, 'J24'): 25.54,(3, 'F24'): 33.1,
 (4, 'Q24'): 29.8,(4, 'J24'): 26.15,(4, 'F24'): 33.45,
 (5, 'Q24'): 30.25,(5, 'J24'): 26.73,(5, 'F24'): 33.77}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:06:19