私はPythonで2次元配列のリストを持っています。 2次元アレイごとに、最後の列はIDを示します。今私はIDの(最後の列)に従って配列の行を(おそらくnumpyで)結合したいと思います。列に従って配列を連結する
たとえば、IDが1の行を連結する必要があります。各IDはアレイごとに1回しか表示されません。さらに、ID(最後の列)および2番目の最後の列は、連結配列の最後にのみ書き込まれます(つまり、1回のみ)。
どうすればいいですか?
私はPythonで2次元配列のリストを持っています。 2次元アレイごとに、最後の列はIDを示します。今私はIDの(最後の列)に従って配列の行を(おそらくnumpyで)結合したいと思います。列に従って配列を連結する
たとえば、IDが1の行を連結する必要があります。各IDはアレイごとに1回しか表示されません。さらに、ID(最後の列)および2番目の最後の列は、連結配列の最後にのみ書き込まれます(つまり、1回のみ)。
どうすればいいですか?
パンダはこの役割だけで良いjoin
メソッドを持っています。 ID列がDataFrame
のインデックスであれば使いやすいです。 2次元配列のうち2つがadata
とbdata
であり、対応するidがa_ids
とb_ids
であるとします。 (整数データセットだけを扱っていて、IDも整数であれば、numpy配列の最後の列に入ることができますが、numpyは浮動小数点値を扱うことが多く、IDは整数ではない文字列です。 numpyの配列が均質であるため、これらの一般的なケースのうち、idを別々に保つことがより良い、または必要でさえあります。
に参加するには:
ab = a.join(b, lsuffix='a', rsuffix='b', how='outer')
降伏:
import pandas as pd
a = pd.DataFrame(adata, index=a_ids)
b = pd.DataFrame(bdata, index=b_ids)
は今、あなたのようなものを持っています
これは外部結合です。つまり、1つまたは他のデータセットで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値で作業したい場合は、すぐに値を返します。
決勝ノート、あなたのIDがすでに各データセットの最後の列として埋め込まれるように、あなたはこのようなデータをつかむためにDataFrame
コンストラクタを調整し、整数値のためにnumpyのを使用している場合:
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
を使用して、最小限の例です:@robot's
サンプルデータとnumpy
バージョンは、
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)
最後の列の値によって行を収集する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(最後の列)と2番目の最後の列は、共同作業の最後にのみ書き込む必要がありますn配列配列(すなわち、 1回だけ)。
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