我有一個python中的2d數組列表。對於每個2d數組,最後一列表示一個ID。現在我想根據ID(最後一列)加入(也許是numpy)數組的行。根據列連接數組
因此,例如應將ID爲1的行連接起來。每個ID只出現一次陣列。另外,ID(最後一列)以及倒數第二列只能寫在串聯數組的最後(即只有一次)。
這怎麼辦?
我有一個python中的2d數組列表。對於每個2d數組,最後一列表示一個ID。現在我想根據ID(最後一列)加入(也許是numpy)數組的行。根據列連接數組
因此,例如應將ID爲1的行連接起來。每個ID只出現一次陣列。另外,ID(最後一列)以及倒數第二列只能寫在串聯數組的最後(即只有一次)。
這怎麼辦?
對於這個角色,熊貓有很好的方法join
方法。如果您的ID列是您的DataFrame
的指數,那麼使用它最簡單。假設您的二維陣列中有兩個是adata
和bdata
,其相應的ID是a_ids
和b_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
下面是使用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)
的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]])]
['添加示例案例'](http://stackoverflow.com/help/mcve)? – Divakar