我有 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]]
最佳答案
使用 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
关于applymap 中的 Python 引用行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43685021/