我有以下3x3x3(3行,3列,每个单元格中有3个元素)numpy数组......
[[[1, 1, 19],
[2, 2, 29],
[3, 3, 39]],
[[4, 4, 49],
[1, 1, 19],
[2, 2, 29]],
[[3, 3, 39],
[9, 9, 99],
[8, 8, 89]]]
以及以下pandas dataframe ...
col0 col1 col2 col3
1 1 19 10
2 2 29 20
3 3 39 30
4 4 49 40
8 8 89 80
9 9 99 90
我想使用col3的值生成一个新的pandas数据帧,它将每个3元素数组(例如[1,1,19]或[4,4.49])与col0,col1,col3匹配。
3元素数组的顺序很重要,第一个元素必须与col0匹配,第二个元素必须与col1匹配,依此类推。
结果数据框如下所示......
colA colB colC
10 20 30
40 10 20
30 90 80
答案 0 :(得分:0)
调用数组needles
和DataFrame haystack
。首先,索引大海捞针:
haystack.set_index(['col0', 'col1', 'col2'], inplace=True)
现在你可以得到第一组针的值:
haystack.loc[list(map(tuple, needles[0]))]
这为您提供了解决方案的第一行(col3
):
col3
col0 col1 col2
1 1 19 10
2 2 29 20
3 3 39 30
最后,对needles
的第一个轴上的每个3x3阵列执行此操作:
pd.DataFrame(haystack.loc[list(map(tuple, pin))].col3.values for pin in needles)
这会给你结果:
0 1 2
0 10 20 30
1 40 10 20
2 30 90 80
可能会或可能不会更快的替代方案:
pd.DataFrame(haystack.col3[pd.MultiIndex.from_arrays(pin.T)].values for pin in needles)
需要map
或MultiIndex.from_arrays()
,因为遗憾的是,Pandas不允许2D数组进行MultiIndex查找 - 只能通过元组的列表(或数组)进行查找。有关详情,请参阅:Pandas MultiIndex lookup with Numpy arrays