2016-05-18 135 views
0

我有一個索引矩陣,我想要獲得相同的矩陣,該矩陣填充了與給定位置上的索引對應的pandas dataframe預定義列中的值。將指數轉換爲相應的熊貓數據框的值

例如,索引矩陣

[[0 1 2] 
[1 0 2] 
[2 1 3] 
[3 4 2]] 

pd.DataFrame [ 「ID」]:

100 
200 
300 
400 
500 
600 
700 
800 
900 

預期結果:

[[100 200 300] 
    [200 100 300] 
    [300 100 400] 
    [400 500 300]] 

顯示

t_ind = [ td[(td.index.isin(ind[:,0]))]["id"].values, 
      td[(td.index.isin(ind[:,1]))]["id"].values, 
      td[(td.index.isin(ind[:,2]))]["id"].values ] 

打破結構並返回唯一值,而完整列表預計

任何想法如何正確地進行轉換?

NB:數據集是巨大的,由元件去元件是不可接受的,則轉換應該在單次操作

回答

0

如果你讓你的指數陣列的ndarray,你可以用它來索引到另一個ndarray,我們可以從您的系列得到使用.values:或者

>>> ix 
array([[0, 1, 2], 
     [1, 0, 2], 
     [2, 1, 3], 
     [3, 4, 2]]) 
>>> df["id"].values[ix] 
array([[100, 200, 300], 
     [200, 100, 300], 
     [300, 200, 400], 
     [400, 500, 300]], dtype=int64) 

,如果您的ix是一個框架,您可以撥打replace

>>> pd.DataFrame(ix).replace(df["id"]) 
    0 1 2 
0 100 200 300 
1 200 100 300 
2 300 200 400 
3 400 500 300 

我懷疑純粹的numpy方法會快得多,但這很容易測量。

+0

謝謝@DSM,我的IX是ndarray和一個數組(不是一個框架)是我需要的,第一個變體工作得很好 – cur4so

0

設置

i_s做是列表的列表。如果它是一個numpy數組,它同樣適用。

i_s = [[0, 1, 2], 
     [1, 0, 2], 
     [2, 1, 3], 
     [3, 4, 2]] 

s = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900]) 

s不必是DataFrame。我這樣做是爲了與OP的問題保持一致。

解決方案

pd.DataFrame([[s.iloc[i, 0] for i in i_s[j]] for j in range(len(i_s))]) 

    0 1 2 
0 100 200 300 
1 200 100 300 
2 300 200 400 
3 400 500 300 
相關問題