2014-03-18 108 views
1

我正在爲API中的可能大型數據抓取構建一些基本支持代碼。結果作爲每個指標值的字典出現。即訂單時填充熊貓數據框的最快方法

[(index0, {col3:val3, col0:val0, col12:val12, ...}), (index1,{...}), ...] 

然而,雖然索引出來的順序列沒有。另外,並非所有列都必須適用於所有索引。

列以正確的順序col_list = [col0, col1, ...]還有indicies index_list = [index0, index1, ...]

我的傾向是剛剛預定義數據框

df = DataFrame(index=index_list, columns=col_list) 

,只是通過df.loc[idx, col] = val分配數據最終是很重要的可能如果數據稀疏,則是最快的方法。但是,數據幾乎肯定是密集的。

是否有任何替代構造函數會顯着更快?

+1

您是否嘗試過使用'pd.read_json'? (這是有效的JSON?)請給一個實際/假裝,但完整的片段來玩。 –

+0

不幸的是,它不是json。該API是非標準的,有點won which,這就是爲什麼我試圖在上面有點模糊。考慮一下,API給出index0然後是cols/vals的詞典,然後是index1和cols/vals的詞典等。 – rhaskett

+0

我首先給出了API給我的列和索引列表。 – rhaskett

回答

0

一個想法是批量加載列表中的數據,然後在索引列上進行排序。熊貓爲這種事情做了優化。

首先,您需要將元組+列表調整爲列表的列表(以便您可以輕鬆地初始化數據框)。一種方法(一襯墊)要做到這一點是這樣的(假設你有過你如何前解析它們無法控制和格式在你的例子):

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 

如果您有多個索引列只使用一個數組[「IDX0」,「IDX1」,...]在set_index方法(雖然你的榜樣讓我相信有一個索引)

+0

這很有趣,我一直在玩它。我試圖瞭解這裏的速度問題。我很擔心幕後發生的事情,多次追加很慢。這會比填充字典[col_name] [index_name]和比from_dict後使用reindex更快嗎? – rhaskett

+0

也許它不是一次完成所有的附加... – rhaskett

+0

你也可以用dicts列表初始化數據幀而不調用append,即df = pd.DataFrame([dict1,dict2,... ]),但我認爲沒有性能差異。 – grasshopper