堆叠大型多索引 df 然后转换为字典的更快替代方案



我有一些多索引的中型数据帧(例如,请参阅下面的示例代码(,我想将它们转换为字典。我目前的方法相当简单,只需要多次stack()然后to_dict().这在小型数据帧上工作正常,但是,随着索引级别的增加和数据帧变大,这种方法会变慢得多。有谁知道更快的方法来做到这一点?

idx = pd.MultiIndex.from_product([['crop1', 'crop2', 'crop3','crop4', 'crop5', 'crop6','crop7', 'crop8', 'crop9','crop10'],
['crop1', 'crop2', 'crop3','crop4', 'crop5', 'crop6','crop7', 'crop8', 'crop9','crop10'],
['crop1', 'crop2', 'crop3','crop4', 'crop5', 'crop6','crop7', 'crop8', 'crop9','crop10'],
['crop1', 'crop2', 'crop3','crop4', 'crop5', 'crop6','crop7', 'crop8', 'crop9','crop10']])
cols = pd.MultiIndex.from_product([['Zara', 'LV', 'Roots'],
['p1', 'p2', 'p3','p4', 'p5', 'p6'],
list(range(17))])
df = pd.DataFrame('-', idx, cols)
df = df.stack([0,1,2]).to_dict()

注意 - 我的最终字典应该同时具有当前索引和当前列标题作为键 即('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 0):value

感谢您的任何建议。

df.stack(level=[0,1,2]).to_dict()

外:

{('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 0): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 1): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 2): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 3): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 4): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 5): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 6): '-',
('crop1', 'crop1', 'crop1', 'crop1', 'LV', 'p1', 7): '-',
...

最新更新