2014-06-20 109 views
1

我有一個相當大的numpy.ndarray。它基本上是一個數組數組。我想將它轉換爲pandas.DataFrame。我想做的是在下面將2D numpy.ndarray轉換爲pandas.DataFrame

from pandas import DataFrame 

cache1 = DataFrame([{'id1': 'ABC1234'}, {'id1': 'NCMN7838'}]) 
cache2 = DataFrame([{'id2': 3276827}, {'id2': 98567498}, {'id2': 38472837}]) 

ndarr = [[4.3, 5.6, 6.7], [3.2, 4.5, 2.1]] 
arr = [] 
for idx, i in enumerate(ndarr): 
    id1 = cache1.ix[idx].id1 
    for idx2, val in enumerate(i): 
     id2 = cache2.ix[idx2].id2 
     if val > 0: 
      arr.append(dict(id1=id1, id2=id2, value=val)) 
df = DataFrame(arr) 
print(df.head()) 

我映射外數組的索引和內部陣列兩個DataFrame S指數得到一定的ID碼。 cache1cache2pandas.DataFrame。每行有~100k行。

這需要很長的時間,就像幾個小時完成。 有什麼方法可以加快速度?

+0

我照原樣複製了代碼。 'cache1 ['A']'是內部的東西(基本上是緩存的關鍵),所以可能會讓人困惑。我現在糾正了它。 – y2p

+0

更新爲SSCCE – y2p

+0

'cache2'中的最後一項不應該是'{'id2':38472837}'而不是'{'id':38472837}'? –

回答

1

我懷疑你ndarr,如果表現爲2D np.array,總有n,m形狀,其中ncache1.id1m長度的cache2.id2長度。而cache2中的最後一項應該是{'id2': 38472837}而不是{'id': 38472837}。如果是這樣,下面簡單的解決方案可能是所有需要什麼:

In [30]: 

df=pd.DataFrame(np.array(ndarr).ravel(), 
      index=pd.MultiIndex.from_product([cache1.id1.values, cache2.id2.values],names=['idx1', 'idx2']), 
      columns=['val']) 
In [33]: 

print df.reset_index() 
     idx1  idx2 val 
0 ABC1234 3276827 4.3 
1 ABC1234 98567498 5.6 
2 ABC1234 38472837 6.7 
3 NCMN7838 3276827 3.2 
4 NCMN7838 98567498 4.5 
5 NCMN7838 38472837 2.1 

[6 rows x 3 columns] 

其實,我也想,保持它具有MultiIndex可能是一個更好的主意。

0

像這樣的東西應該工作:

ndarr = np.asarray(ndarr) # if ndarr is actually an array, skip this 
fast_df = pd.DataFrame({"value": ndarr.ravel()}) 
i1, i2 = [i.ravel() for i in np.indices(ndarr.shape)] 
fast_df["id1"] = cache1["id1"].loc[i1].values 
fast_df["id2"] = cache2["id2"].loc[i2].values 

這給

>>> fast_df 
    value  id1  id2 
0 4.3 ABC1234 3276827 
1 5.6 ABC1234 98567498 
2 6.7 ABC1234  NaN 
3 3.2 NCMN7838 3276827 
4 4.5 NCMN7838 98567498 
5 2.1 NCMN7838  NaN 

,然後如果你真的要刪除的零個值,你可以只保留使用fast_df = fast_df[fast_df['value'] != 0]非零的。

+0

完美。謝謝你 – y2p