2016-05-18 34 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 
相关问题