我正在为API中可能的大数据抓取构建一些基本支持代码。结果作为每个指数值的字典出现。即。
[(index0, {col3:val3, col0:val0, col12:val12, ...}), (index1,{...}), ...]
然而,虽然索引出来的顺序是列没有。此外,并非所有列都必须适用于所有索引。
重要的是,列的排列顺序为col_list = [col0, col1, ...]
以及标记index_list = [index0, index1, ...]
我倾向于预定义数据帧
df = DataFrame(index=index_list, columns=col_list)
并按df.loc[idx, col] = val
分配数据,如果数据稀疏,这可能是最快的方法。但是,数据几乎肯定是密集的。
是否有任何替代构造函数会明显更快?
答案 0 :(得分:0)
一个想法是从dicts列表中批量加载数据,然后在索引列上排序。熊猫针对这种事情进行了优化。
首先,您需要将元组列表+ dicts调整为dicts列表(以便您可以轻松初始化数据帧)。一种方法(单行)就是这样(假设您无法控制之前解析它们的方式,格式如示例所示):
your_data = [(2,{"col1":2,"col2":3}),(-1,{"col3":22,"col1":4})]
dict = [x[1].update({"idx_col":x[0]}) or x[1] for x in your_data]
dict>> [{'col1': 2, 'col2': 3, 'idx_col': 2}, {'col1': 4, 'col3': 22, 'idx_col': -1}]
然后:
df = pd.DataFrame(columns=["col1","col2","col3"]) #not necessary if every col appears
#at least once in the data
df = df.append([{"idx_col":2,"col1":2,"col2":3},{"idx_col":-1,"col3":22,"col1":4}])
#column order preserved
df = df.set_index("idx_col",drop=True).sort() #index order preserved now
结果df:
col1 col2 col3
idx_col
-1 4 NaN 22
2 2 3 NaN
如果您有多个索引列,只需在set_index方法中使用数组[" idx0"," idx1",...](尽管您的示例让我相信有一个索引)