2017-01-16 94 views
0

我有一個python中的2d數組列表。對於每個2d數組,最後一列表示一個ID。現在我想根據ID(最後一列)加入(也許是numpy)數組的行。根據列連接數組

因此,例如應將ID爲1的行連接起來。每個ID只出現一次陣列。另外,ID(最後一列)以及倒數第二列只能寫在串聯數組的最後(即只有一次)。

這怎麼辦?

+2

['添加示例案例'](http://stackoverflow.com/help/mcve)? – Divakar

回答

1

對於這個角色,熊貓有很好的方法join方法。如果您的ID列是您的DataFrame的指數,那麼使用它最簡單。假設您的二維陣列中有兩個是adatabdata,其相應的ID是a_idsb_ids。 (如果你只處理整數數據集,並且你的id也是整數,它們可以進入numpy數組的最後一列,但經常numpy處理浮點值,而id通常是字符串而不是整數,在這些常見情況下,由於numpy數組是均勻的,所以更好或甚至必須保持id不同。)

import pandas as pd 

a = pd.DataFrame(adata, index=a_ids) 
b = pd.DataFrame(bdata, index=b_ids) 

現在你有這樣的:

要加入:

ab = a.join(b, lsuffix='a', rsuffix='b', how='outer') 

產量:

這是一個外連接,這意味着它返回所有記錄的聯合,包括僅在一個或另一個數據集中出現id的情況。如果您只想在兩個輸入上匹配(或者如果所有數據集都有相同的ID),則可以使用how='inner'來實現更緊密的交叉連接。

如果你想有一個numpy的陣列後面,而不是DataFrame,很簡單:

ab.values 

產量:

array([[-0.68185189, 2.06517757, 0.49309249, 0.56342363], 
     [ 0.18518231, -2.93460494,   nan,   nan], 
     [ 0.06447249, -0.30244753, 2.46605889, -0.28043202], 
     [ 0.62137062, 0.10228747, -0.21668058, -1.07091799], 
     [-0.37247196, -1.5782334 ,   nan,   nan], 
     [-1.0523353 , -0.52960419,   nan,   nan], 
     [ 0.13638979, 0.92173315,   nan,   nan]]) 

而對於加入指數:

ab.index.values 

得到:

array([1001, 1002, 1003, 1004, 1005, 1006, 1007]) 

所以,當你通過Pandas跳舞並從它的高層次連接操作中受益時(即使你的數據集大小不同,包含的ID也不完全相同,即使ID落在不同的位置順序),如果你想要與NumPy值一起工作,你就回到NumPy值。

最後一點,如果你使用NumPy的整數值,讓你的ID已經被嵌入在每個數據集的最後一列,只需調整DataFrame建設者抓住這樣的數據:

a = pd.DataFrame(adata[:, :-1], index=adata[:, -1]) 
b = pd.DataFrame(bdata[:, :-1], index=bdata[:, -1]) 

        # data     ids 
        #^all rows   ^all rows 
        # ^all but last col ^just last col 
0

下面是使用pandas一個最小的例子,因爲最初沒有提供任何數據或代碼:

import numpy as np 
import pandas as pd 

# let the last column in these 2-d arrays be the "ID" column 
arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]]) 
arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]]) 

df1 = pd.DataFrame(arr1) 
df2 = pd.DataFrame(arr2) 

# Again, a minimal example, but the column at index 4 in these 
# DataFrames is the ID column, so we can merge on 4 to get our result 
result = pd.merge(df1, df2, on = 4) 
0

numpy版本@robot's樣本數據,使用argsort由最後一列值,收集行:

In [28]: arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]]) 
In [29]: arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]]) 
In [30]: arr=np.concatenate((arr1,arr2),axis=0) 
In [31]: arr 
Out[31]: 
array([[0, 0, 1, 1, 1], 
     [0, 1, 0, 0, 2], 
     [1, 1, 1, 2, 3], 
     [1, 1, 1, 1, 1], 
     [2, 1, 0, 0, 2], 
     [2, 2, 1, 2, 3]]) 
In [32]: idx=np.argsort(arr[:,-1]) 
In [33]: idx 
Out[33]: array([0, 3, 1, 4, 2, 5], dtype=int32) 
In [34]: arr[idx,:] 
Out[34]: 
array([[0, 0, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [0, 1, 0, 0, 2], 
     [2, 1, 0, 0, 2], 
     [1, 1, 1, 2, 3], 
     [2, 2, 1, 2, 3]]) 

另外,ID(最後一列)以及倒數第二列只能寫在公司的最後一欄無序數組(即只有一次)。

這個需求,如果我理解正確,不可能用numpy這個數組必須每行的列數相同。通過pandas,您可以構建多級索引,並且推測可以使用此ID作爲索引級別。

我們需要您自己的樣本,輸入和結果,以做得更好。

===============

我們可以使用np.split打破這種排序的數組成陣列與一個共同的最後一列。我手動選擇了[2,4],但如果您有興趣,可以從數據中獲得。

In [39]: np.split(arr[idx,:],[2,4]) 
Out[39]: 
[array([[0, 0, 1, 1, 1], 
     [1, 1, 1, 1, 1]]), 
array([[0, 1, 0, 0, 2], 
     [2, 1, 0, 0, 2]]), 
array([[1, 1, 1, 2, 3], 
     [2, 2, 1, 2, 3]])]