Pandas:pandas.DataFrame.from_dict未能保留通过OrderedDict指定的顺序

Pandas:pandas.DataFrame.from_dict未能保留通过OrderedDict指定的顺序

在本文中,我们将深入研究Pandas中pandas.DataFrame.from_dict函数未能保留通过OrderedDict指定的顺序的问题。

阅读更多:Pandas 教程

背景

在Python中,我们可以使用OrderedDict来创建有序字典。

from collections import OrderedDict

my_dict = OrderedDict()
my_dict['apple'] = 4
my_dict['banana'] = 2
my_dict['orange'] = 1
Python

以上代码将创建一个有序字典,其中第一个键是’apple’,第二个键是’banana’,第三个键是’orange’。

我们可以使用pandas.DataFrame.from_dict函数将字典转换为数据框。从Pandas 0.23开始,pandas.DataFrame.from_dict具有一个新的选项orient,可以通过orient = ‘index’使用有序字典作为输入数据,例如:

import pandas as pd

my_dict = OrderedDict()
my_dict['apple'] = [4, 5]
my_dict['banana'] = [2, 3]
my_dict['orange'] = [1, 2]
df = pd.DataFrame.from_dict(my_dict, orient='index', columns=['col1', 'col2'])
print(df)
Python

输出结果为:

        col1  col2
apple      4     5
banana     2     3
orange     1     2
Text

但是,如果我们稍微改变my_dict的顺序,例如将’banana’放在第一位:

my_dict = OrderedDict()
my_dict['banana'] = [2, 3]
my_dict['apple'] = [4, 5]
my_dict['orange'] = [1, 2]
df = pd.DataFrame.from_dict(my_dict, orient='index', columns=['col1', 'col2'])
print(df)
Python

输出结果为:

        col1  col2
banana     2     3
apple      4     5
orange     1     2
Text

我们会发现,虽然使用了有序字典,但pandas.DataFrame.from_dict并未按照我们指定的顺序排列数据框中的行。

原因

造成这个问题的原因是pandas.DataFrame.from_dict函数默认按照字典键的顺序进行排序,而OrderedDict中的顺序不会影响字典的键的顺序。也就是说,虽然我们使用了有序字典,但是字典的键在传递给pandas.DataFrame.from_dict函数之前已经被排序了。

针对以上问题的讨论,Pandas社区已经给出了解决方案。

解决方法

一种解决方法是,在创建有序字典时使用从列表到元组的转换:

my_list = [('banana', [2, 3]), ('apple', [4, 5]), ('orange', [1, 2])]
my_dict = OrderedDict(my_list)
df = pd.DataFrame.from_dict(my_dict, orient='index', columns=['col1', 'col2'])
print(df)
Python

输出结果为:

        col1  col2
banana     2     3
apple      4     5
orange     1     2
Text

另一种方法是使用pandas.DataFrame的reindex方法。首先,我们将数据框的列名保存到一个列表中,然后使用OrderedDict创建有序字典,并使用keys()方法将字典的键转换为列表。然后,我们可以使用reindex()方法按照我们想要的顺序重新排列数据框。

my_dict = OrderedDict()
my_dict['banana'] = [2, 3]
my_dict['apple'] = [4, 5]
my_dict['orange'] = [1, 2]
df = pd.DataFrame.from_dict(my_dict)
columns = df.columns.tolist()
my_dict_ordered = OrderedDict([('banana', [2, 3]), ('apple', [4, 5]), ('orange', [1, 2])])
df = pd.DataFrame.from_dict(my_dict_ordered)
df = df.reindex(columns, axis=1)
print(df)
Python

输出结果为:

   banana  apple  orange
0       2      4       1
1       3      5       2
Text

总结

虽然Pandas中pandas.DataFrame.from_dict函数未能保留通过OrderedDict指定的顺序,但可以通过转换和reindex方法解决这个问题。当我们需要保留字典中元素的顺序时,我们应该使用列表到元组的转换或reindex方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册