【发布时间】: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),您将只拥有两者共有的子集。 -
您可以选择
dict或DataFrames。如果重叠字段的数量与总字段的数量相比变得很小,这将是合适的。但在你上面的例子中,我会说一个 DataFrame 就足够了。您将在该特征不适用的行中获得NaN,并且pandas 具有非常明智的NaN处理方式,这将使平均值和计数之类的东西毫无问题地工作。