2016-10-16 8 views
2

私は2つのパンダのDataFramesを "マージ連結"しようとしています。基本的には、2つのDataFrameを積み重ねたいのですが、他のDataFrameの値と一致する各DataFrameの行を保持するだけです。だから、例えば:data1data2でこの操作を行った後、次に列内の値が一致する行のみを保持するpandasデータフレームを連結しますか?

data1: 

+---+------------+-----------+-------+ 
| | first_name | last_name | class | 
+---+------------+-----------+-------+ 
| 0 | Alex  | Anderson |  1 | 
| 1 | Amy  | Ackerman |  2 | 
| 2 | Allen  | Ali  |  3 | 
| 3 | Alice  | Aoni  |  4 | 
| 4 | Andrew  | Andrews |  4 | 
| 5 | Ayoung  | Atiches |  5 | 
+---+------------+-----------+-------+ 

data2: 

+---+------------+-----------+-------+ 
| | first_name | last_name | class | 
+---+------------+-----------+-------+ 
| 0 | Billy  | Bonder |  4 | 
| 1 | Brian  | Black  |  5 | 
| 2 | Bran  | Balwner |  6 | 
| 3 | Bryce  | Brice  |  7 | 
| 4 | Betty  | Btisan |  8 | 
| 5 | Bruce  | Bronson |  8 | 
+---+------------+-----------+-------+ 

結果のデータ・フレームは次のようになります。基本的に、私は2つのデータセットをマージしようとしている

result: 

+---+------------+-----------+-------+ 
| | first_name | last_name | class | 
+---+------------+-----------+-------+ 
| 3 | Alice  | Aoni  |  4 | 
| 4 | Andrew  | Andrews |  4 | 
| 5 | Ayoung  | Atiches |  5 | 
| 0 | Billy  | Bonder |  4 | 
| 1 | Brian  | Black  |  5 | 
+---+------------+-----------+-------+ 

、その後、列を積み重ねる。私はこれを行うためのいくつかの方法を考えることができますが、彼らはすべての種類のハックです。私はdata1data2をマージして、列を積み重ね、またはのようなマップを使用することができます。

map1 = data1['subject_id'].map(lambda x: x in list(data2['subject_id'])) 
map2 = data2['subject_id'].map(lambda x: x in list(data1['subject_id'])) 
pd.concat([data1[map1], data2[map2]]) 

しかし、これまでよりエレガントな解決策はありますか?

答えて

1

これはいかがですか?

In [335]: cls = np.intersect1d(data1['class'], data2['class']) 

In [336]: cls 
Out[336]: array([4, 5], dtype=int64) 

In [337]: pd.concat([data1.ix[data1['class'].isin(cls)], data2.ix[data2['class'].isin(cls)]]) 
Out[337]: 
    first_name last_name class 
3  Alice  Aoni  4 
4  Andrew Andrews  4 
5  Ayoung Atiches  5 
0  Billy Bonder  4 
1  Brian  Black  5 

か:

In [338]: data1.ix[data1['class'].isin(cls)].append(data2.ix[data2['class'].isin(cls)]) 
Out[338]: 
    first_name last_name class 
3  Alice  Aoni  4 
4  Andrew Andrews  4 
5  Ayoung Atiches  5 
0  Billy Bonder  4 
1  Brian  Black  5 
関連する問題