我有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]]
答案 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