【问题标题】:How to persist a python dictionary?如何持久化python字典?
【发布时间】:2019-05-15 11:02:26
【问题描述】:

我有一个python程序,它接收不同类型的对象列表,对于每种类型,程序将输出一个键/值属性字典,其中键是给定对象类型的某个属性,值是它的计算结果。

为了更具体,我的程序接收了一个包含 2000 个对象的列表,这些对象有 3 种独特的类型:汽车、飞机、船舶。对于汽车,它会产生:

{“ID”:,“马力”:120.5,“燃油效率”:19, “转弯半径”:20,“重量”:500}

对于船,它是

{“ID”:,“排量”:1000.5,“燃油效率”:8, “重量”:2000}

飞机是

{"ID": , "Engine Size": 200.5, "Fuel Efficiency": 8, “重量”:2000}

所以你可以看到,对于每种类型,其字典输出的数量和内容是不同的,而它们可能都共享一些公共字段,例如“ID”(不同对象之间唯一)、“重量”等。

明天可能会有一种新类型需要程序支持,具有类似的输出结构。

问题是持久化这些输出的最佳方式是什么,以便以后轻松查询/聚合。如:给我所有重量>=1000的飞机,或者给我所有马力在200到300之间的汽车的重量。

假设我们使用 pandas 数据框作为我们的存储格式,我面临 2 个选择:

取所有产品类型的所有键的并集,并创建一个以这些键为列的 pandas df,每一行代表每个产品的输出,根据产品的不同,给定列中可能有 None。这实质上创建了一个稀疏矩阵。并且列名可以增长,因为新产品类型可以有新的键作为输出。

创建一个包含 3 列的 pandas df:ID、Key、Value。

你推荐哪一个,或者我缺少明显的第三个选项?

【问题讨论】:

  • 你想要一个熊猫方法吗? ,尝试将您的字典列表传递给pd.DataFrame(l)
  • 我会使用pd.DataFrame,然后按照您的意愿索引。例如,df.loc[:,['key1','key2']].dropna(how="any", axis=0),您将只拥有两者共有的子集。
  • 您可以选择dictDataFrames。如果重叠字段的数量与总字段的数量相比变得很小,这将是合适的。但在你上面的例子中,我会说一个 DataFrame 就足够了。您将在该特征不适用的行中获得NaN,并且pandas 具有非常明智的NaN 处理方式,这将使平均值和计数之类的东西毫无问题地工作。

标签: python pandas


【解决方案1】:

我建议使用 pandas 持久化为 json,并根据需要使用 pandas 重新加载。 Pandas 将使您的阅读和写作变得非常容易。这使您可以在数据框中拥有列的超集,并且在缺少数据的点中具有空值。

这也使您无需执行键值对存储选项。

另外,您的数据似乎已经采用接近 json 的格式。将其加载回数据框后,根据需要进行查询也很简单。

【讨论】:

    【解决方案2】:

    json.dumpsjson.loads 是你的朋友。为了将您的结构转换为持久化,dumps 创建了一个唯一的字符串,该字符串可以写入任何类似文件的对象,并且加载可以从类似字符串的对象重新加载它。希望对您有所帮助!

    【讨论】:

    • 这样查询起来不太方便。
    • 当你 .load 回来时,它是一本字典,所以我不明白它是如何让查询变得困难的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2014-01-31
    • 2011-02-20
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多