首页 > 解决方案 > 如何根据索引合并两个 numpy 数据集?

问题描述

我有两个大型数据集,虽然 pandas 可以更轻松地合并数据集,但它占用了太多内存供我使用。在 pandas 中,它看起来像这样:

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})

result = pd.merge(left, right, on='key')

在这种情况下,合并只是连接right数据集中的两列,但这通常在键被打乱时使用。我将如何在 Numpy 中执行此操作?

标签: pythonnumpy

解决方案


In [2]: import pandas as pd
In [3]: left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
   ...:                      'A': ['A0', 'A1', 'A2', 'A3'],
   ...:                      'B': ['B0', 'B1', 'B2', 'B3']})
   ...: 
   ...: right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
   ...:                       'C': ['C0', 'C1', 'C2', 'C3'],
   ...:                       'D': ['D0', 'D1', 'D2', 'D3']})
   ...: 
In [4]: left
Out[4]: 
  key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2
3  K3  A3  B3
In [5]: right
Out[5]: 
  key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3
In [6]: result = pd.merge(left, right, on='key')
In [7]: result
Out[7]: 
  key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3  C3  D3

如果您展示了这些数据框,那就太好了。这样我们就不必“想象”结果或在我们的小脑袋里运行代码:(

正如我所建议的,查看从框架派生的数组:

In [8]: left.to_numpy()
Out[8]: 
array([['K0', 'A0', 'B0'],
       ['K1', 'A1', 'B1'],
       ['K2', 'A2', 'B2'],
       ['K3', 'A3', 'B3']], dtype=object)
In [9]: right.to_numpy()
Out[9]: 
array([['K0', 'C0', 'D0'],
       ['K1', 'C1', 'D1'],
       ['K2', 'C2', 'D2'],
       ['K3', 'C3', 'D3']], dtype=object)
In [10]: result.to_numpy()
Out[10]: 
array([['K0', 'A0', 'B0', 'C0', 'D0'],
       ['K1', 'A1', 'B1', 'C1', 'D1'],
       ['K2', 'A2', 'B2', 'C2', 'D2'],
       ['K3', 'A3', 'B3', 'C3', 'D3']], dtype=object)

如果键匹配,我们可以简单地concatenate

In [11]: np.concatenate([Out[8], Out[9][:,1:]], axis=1)
Out[11]: 
array([['K0', 'A0', 'B0', 'C0', 'D0'],
       ['K1', 'A1', 'B1', 'C1', 'D1'],
       ['K2', 'A2', 'B2', 'C2', 'D2'],
       ['K3', 'A3', 'B3', 'C3', 'D3']], dtype=object)

numpy没有“合并”功能。如果键只是以一个或另一个重新排序,您可以构造重新排序行以匹配,例如

In [12]: Out[9][[3,1,0,2],:]
Out[12]: 
array([['K3', 'C3', 'D3'],
       ['K1', 'C1', 'D1'],
       ['K0', 'C0', 'D0'],
       ['K2', 'C2', 'D2']], dtype=object)

如果需要,我会让你弄清楚重新排序,包括任何丢失或重复的键。由于pandas已经解决了这些细节,因此重新发明轮子可能不值得您花时间重新发明轮子numpy(尤其是如果您还不精通numpy.


推荐阅读