applymap

时间:2017-04-28 16:35:09

标签: python python-2.7 pandas numpy

我有2个数据帧

>>> x
   0  1  2  3
0  1  2  3  4
1  2  3  4  1
2  3  4  1  2
3  4  1  2  3
>>> y
   0  1  2  3
0  1  2  3  0
1  2  3  0  1
2  3  0  1  2
3  0  1  2  3

我的目标是根据以下规则映射4x4数据帧z: 对于z中的每个元素,在x中找到一个元素  x中的行与z中的行匹配  x中的列名称/值与y

中位置相同的单元格的值匹配

因此,例如,对于z中的[0,0]单元格,该行应为0,并且该列应为1,因为y [0,0] = 1。因此,z [0,0] = x [0,1] = 2。

类似地,对于z中的[2,2]单元格,该行应为2,并且该列应为1,因为y [2,2] = 1。因此,z [2,2] = x [2,1] = 4。

我可以使用以下代码引用正确的列:

>>> z = y.applymap(lambda row: x.ix[1,row])
>>> z
   1  2  3  4
0  3  4  1  2
1  4  1  2  3
2  1  2  3  4
3  2  3  4  1

但是我还没有能够引用正确的行,正如您在上一个示例中看到的那样,我将行硬编码为1.我的问题是如何在applymap函数中获取引用相同的代码行位置而不是输入参数的值?

编辑:根据下面的评论,我正在寻找z [i,j] = x [i,y [i,j]]

1 个答案:

答案 0 :(得分:2)

使用Numpy的advanced-indexing,我们可以表达z[i,j]=x[i,y[i,j]],就像这样 -

pd.DataFrame(x.values[np.arange(y.shape[0])[:,None], y])

示例输出 -

In [47]: pd.DataFrame(x.values[np.arange(y.shape[0])[:,None], y])
Out[47]: 
   0  1  2  3
0  2  3  4  1
1  4  1  2  3
2  2  3  4  1
3  4  1  2  3