订单重要时填充Pandas DataFrame的最快方法

时间:2014-03-18 23:41:02

标签: python pandas dataframe

我正在为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分配数据,如果数据稀疏,这可能是最快的方法。但是,数据几乎肯定是密集的。

是否有任何替代构造函数会明显更快?

1 个答案:

答案 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",...](尽管您的示例让我相信有一个索引)