从匹配numpy数组和pandas数据框创建新的pandas df

时间:2018-02-14 14:17:38

标签: python pandas numpy

我有以下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

1 个答案:

答案 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)

需要mapMultiIndex.from_arrays(),因为遗憾的是,Pandas不允许2D数组进行MultiIndex查找 - 只能通过元组的列表(或数组)进行查找。有关详情,请参阅:Pandas MultiIndex lookup with Numpy arrays