Pandas 使用 Pandas 中的 from_dict 方法时,使用 OrderedDict 对象传递的键值对的顺序不被保留的问题,并提供一些解决方案

Pandas 使用 Pandas 中的 from_dict 方法时,使用 OrderedDict 对象传递的键值对的顺序不被保留的问题,并提供一些解决方案

在本文中,我们将介绍使用 Pandas 中的 from_dict 方法时,使用 OrderedDict 对象传递的键值对的顺序不被保留的问题,并提供一些解决方案。
阅读更多:Pandas 教程

问题描述

Pandas 的 from_dict 方法通常可以方便地将字典转换为数据框。以下是一个简单的示例:

import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 32, 45],
        'gender': ['female', 'male', 'male']}

df = pd.DataFrame.from_dict(data)
print(df)

该代码输出以下结果:

       name  age  gender
0     Alice   25  female
1       Bob   32    male
2  Charlie   45    male

上述代码中的原始字典的键值对是无序的,但生成的数据框中的列却有序排列。但是,如果我们使用 OrderedDict 来创建原始字典,则此顺序将被忽略:

from collections import OrderedDict

ordered_data = OrderedDict([('name', ['Alice', 'Bob', 'Charlie']),
                            ('age', [25, 32, 45]),
                            ('gender', ['female', 'male', 'male'])])

df = pd.DataFrame.from_dict(ordered_data)
print(df)

输出结果与上面相同:

       name  age  gender
0     Alice   25  female
1       Bob   32    male
2  Charlie   45    male

原始字典使用了有序字典 OrderedDict 来保持顺序,但数据框的列仍然是无序排列的,这可能会影响到我们代码中的其它部分,需要注意。

解决方案

指定列顺序

最简单的解决方案是手动指定列的顺序。我们可以使用 reindex 方法改变列的顺序,如下所示:

df = pd.DataFrame.from_dict(ordered_data)
df = df.reindex(columns=['name', 'age', 'gender'])
print(df)

这将输出按照指定顺序排列的数据框:

       name  age  gender
0     Alice   25  female
1       Bob   32    male
2  Charlie   45    male

自定义字典扩展类

我们可以自定义扩展一个字典类,以确保生成的数据框按照字典中的顺序排列。以下是一个使用 OrderedDict 和自定义字典扩展类的示例:

class OrderedCounter(OrderedDict):
    def __missing__(self, key):
        self[key] = 0
        return self[key]

data = OrderedCounter([('name', ['Alice', 'Bob', 'Charlie']),
                       ('age', [25, 32, 45]),
                       ('gender', ['female', 'male', 'male'])])

df = pd.DataFrame.from_dict(dict(data))
print(df)

输出结果将按照字典顺序排列:

       name  age  gender
0     Alice   25  female
1       Bob   32    male
2  Charlie   45    male

使用 Pandas 0.23.0+ 中的 sort=False 参数

从 Pandas 0.23.0 版本开始,我们可以将 sort 参数设置为 False 来保留生成的数据框列的顺序。以下是使用 sort=False 的示例:

df = pd.DataFrame.from_dict(ordered_data, sort=False)
print(df)

此代码也将得到按照字典顺序排列的结果:

       name  age  gender
0     Alice   25  female
1       Bob   32    male
2  Charlie   45    male

总结

在本文中,我们介绍了在使用 Pandas 的 from_dict 方法时,使用 OrderedDict 对象传递的键值对的顺序不被保留的问题,并提供了一些解决方案。当我们需要保留原始字典的顺序时,我们可以手动指定列的顺序、使用自定义的字典扩展类或者使用 Pandas 0.23.0+ 中的 sort=False 参数。在实际应用中,我们应该根据具体情况选择合适的方法来解决顺序问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程