如何用更优雅的方式将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
相关产品推荐
相关产品推荐

