【问题标题】:Pandas dataframe from dict, why?来自 dict 的 Pandas 数据框,为什么?
【发布时间】:2020-04-01 19:36:06
【问题描述】:

我可以从 dict 创建一个 pandas 数据框,如下所示:

d = {'Key':['abc','def','xyz'], 'Value':[1,2,3]}
df = pd.DataFrame(d)
df.set_index('Key', inplace=True)

还可以先创建一个这样的系列:

d = {'abc': 1, 'def': 2, 'xyz': 3}
a = pd.Series(d, name='Value')
df = pd.DataFrame(a)

但不是直接这样:

d = {'abc': 1, 'def': 2, 'xyz': 3}
df = pd.DataFrame(d)

我知道from_dict 方法,这也给出了预期的结果:

d = {'abc': 1, 'def': 2, 'xyz': 3}
pd.DataFrame.from_dict(d, orient='index')

但我不明白为什么:

(1) 当从系列或列表作品创建时,需要一个单独的方法从字典创建数据框,没有问题;

(2) 如何/为什么从 dict/list 列表创建数据框有效,但不能直接从 dict 创建。

找到了几个提供解决方案的 SE 答案,但寻找 “为什么”,因为这种行为似乎不一致。任何人都可以阐明我在这里可能缺少的东西。

【问题讨论】:

    标签: python python-3.x pandas python-3.7


    【解决方案1】:

    这里实际上发生了很多事情,所以让我们分解一下。


    问题

    创建DataFrame 的方法有很多(从记录列表、dict、csv、ndarray 等...),即使对于 python 的老手来说,也可能需要很长时间才能理解它们。见鬼,在这些方法中,有更多方法可以通过调整一些参数等等来构建DataFrame

    例如,对于字典(其中的值是等长列表),pandas 可以通过以下两种方式处理它们:

    案例 1: 您将每个键值对视为一个列标题,并且它分别是每一行的值。在这种情况下,行没有名称,因此默认情况下您可以只通过行索引来命名它们。

    案例 2: 您将每个键值对分别视为行的名称和每列的值。在这种情况下,列没有名称,因此默认情况下您可能只是通过它们的索引来命名它们。


    解决方案

    Python 是一种弱类型语言(也就是变量不声明类型,函数不声明返回)。因此,它没有函数重载。因此,当您想要创建一个可以有多种构造方式的对象类时,您基本上有两种理念:

    1. 只创建一个构造函数来检查输入并相应地处理它,涵盖所有可能的选项。当某些输入有自己的选项/参数并且种类太多时,这可能会变得非常臃肿和复杂。
    2. 将每个选项分成@classmethod,以处理构造对象的每种特定方式。

    第二个通常更好,因为它确实将关注点分离作为 SE 设计原则,但是因此用户需要知道所有不同的 @classmethod 构造函数调用。尽管在我看来,如果您的对象类足够复杂,可以有许多不同的构造选项,那么用户无论如何都应该意识到这一点。


    Panda 的方式

    Pandas 采用了两种解决方案之间的混合。它将使用每种输入类型的默认行为,如果您想获得任何额外的功能,您需要使用各自的 @classmethod 构造函数。

    例如,对于dicts,默认情况下,如果您将dict传递给DataFrame构造函数,它将作为Case 1处理。如果你想做第二种情况,你需要使用DataFrame.from_dict并传入orient='index'(没有orient='index',它将使用基本Case 1所述的默认行为)。

    在我看来,我不喜欢这种实现方式。就个人而言,它比有用更令人困惑。老实说,很多熊猫都是这样设计的。 pandas 成为 stackoverflow 上所有其他 python 标记问题的主题是有原因的。

    【讨论】:

    • 被拉进了别的东西,因此延迟了响应。这很有启发性,并且与我对 pandas 的基本经验一致:'哇,这比预期的要容易得多',但有时'wtf'。感谢您的回复。
    猜你喜欢
    • 2017-05-02
    • 2016-06-06
    • 2018-12-02
    • 2021-08-07
    • 2022-08-11
    • 1970-01-01
    • 2021-04-22
    • 2019-08-12
    • 2018-02-03
    相关资源
    最近更新 更多