Pandas:pandas.DataFrame.from_dict未能保留通过OrderedDict指定的顺序
在本文中,我们将深入研究Pandas中pandas.DataFrame.from_dict函数未能保留通过OrderedDict指定的顺序的问题。
阅读更多:Pandas 教程
背景
在Python中,我们可以使用OrderedDict来创建有序字典。
以上代码将创建一个有序字典,其中第一个键是’apple’,第二个键是’banana’,第三个键是’orange’。
我们可以使用pandas.DataFrame.from_dict函数将字典转换为数据框。从Pandas 0.23开始,pandas.DataFrame.from_dict具有一个新的选项orient,可以通过orient = ‘index’使用有序字典作为输入数据,例如:
输出结果为:
但是,如果我们稍微改变my_dict的顺序,例如将’banana’放在第一位:
输出结果为:
我们会发现,虽然使用了有序字典,但pandas.DataFrame.from_dict并未按照我们指定的顺序排列数据框中的行。
原因
造成这个问题的原因是pandas.DataFrame.from_dict函数默认按照字典键的顺序进行排序,而OrderedDict中的顺序不会影响字典的键的顺序。也就是说,虽然我们使用了有序字典,但是字典的键在传递给pandas.DataFrame.from_dict函数之前已经被排序了。
针对以上问题的讨论,Pandas社区已经给出了解决方案。
解决方法
一种解决方法是,在创建有序字典时使用从列表到元组的转换:
输出结果为:
另一种方法是使用pandas.DataFrame的reindex方法。首先,我们将数据框的列名保存到一个列表中,然后使用OrderedDict创建有序字典,并使用keys()方法将字典的键转换为列表。然后,我们可以使用reindex()方法按照我们想要的顺序重新排列数据框。
输出结果为:
总结
虽然Pandas中pandas.DataFrame.from_dict函数未能保留通过OrderedDict指定的顺序,但可以通过转换和reindex方法解决这个问题。当我们需要保留字典中元素的顺序时,我们应该使用列表到元组的转换或reindex方法。