如何从三列Pandas DataFrame生成以(date,ticker)为键的字典?
问题
我正在处理一个包含三列股票收益数据的Pandas DataFrame,列名分别为date、ticker、total_return,想要生成一个以date和ticker组成的元组为键、total_return为值的字典。目前生成的字典里total_return被额外当作第三个键,不符合需求。
初始DataFrame示例
date ticker total_return 0 2009-10-02 AIR 0.024265 1 2009-10-05 AIR 0.010478 2 2009-10-06 AIR 0.020739 3 2009-10-07 AIR -0.029594 4 2009-10-08 AIR 0.021848
当前使用的代码
daily_dict_input.set_index(['date','ticker']).stack().to_dict()
当前得到的结果
{(datetime.date(2009, 10, 2), 'AIR', 'total_return'): 0.02426504899673332, (datetime.date(2009, 10, 5), 'AIR', 'total_return'): 0.010478359908883794, (datetime.date(2009, 10, 6), 'AIR', 'total_return'): 0.020739404869251743, (datetime.date(2009, 10, 7), 'AIR', 'total_return'): -0.02959363957597183, (datetime.date(2009, 10, 8), 'AIR', 'total_return'): 0.02184797451069631}
期望的结果
{(datetime.date(2009, 10, 2), 'AIR'): 0.02426504899673332, (datetime.date(2009, 10, 5), 'AIR'): 0.010478359908883794, (datetime.date(2009, 10, 6), 'AIR'): 0.020739404869251743, (datetime.date(2009, 10, 7), 'AIR'): -0.02959363957597183, (datetime.date(2009, 10, 8), 'AIR'): 0.02184797451069631}
解决方案
不需要使用stack(),直接针对total_return列操作即可,以下是几种简洁高效的实现方式:
方法一:设置索引后提取目标列转字典
先将date和ticker设为复合索引,再直接提取total_return列转换为字典,这是最简洁高效的方式:
daily_dict_input.set_index(['date', 'ticker'])['total_return'].to_dict()
方法二:用zip直接构建键值对
通过两层zip将date和ticker打包成元组作为键,total_return作为值,直接生成字典:
dict(zip(zip(daily_dict_input['date'], daily_dict_input['ticker']), daily_dict_input['total_return']))
方法三:遍历行生成字典
通过itertuples()遍历DataFrame的每一行,手动构建目标格式的键值对:
{(row.date, row.ticker): row.total_return for row in daily_dict_input.itertuples()}
以上三种方法都能直接得到你需要的(date, ticker): total_return格式的字典,其中方法一在处理大规模数据时性能最优。
内容的提问来源于stack exchange,提问作者davidpantile
相关产品推荐
相关产品推荐

