2017-12-12 6 views
1

私は2つのパンダのデータフレームaとbを持っています。 aとbは、英語の文字列を含む2つの共通の列、たとえばxとyを共有します。 xとyの各組み合わせはaとbの中で一意です。 Bにはないの行でなければなりませんC、に関しては、 - 私は私は何に興味が残り、D =ですパンダで2次元補体を見つける

c = pandas.merge(a, b, on=['x', 'y']) 

のように計算することができ、xとyの一般的なサブセットは、ありますxとyの2つの列に私は現在、何

は、私は別のcolumのXYを追加します:

a['xy'] = a['x'] + a['y'] 
c['xy'] = c['x'] + c['y'] 

、その後

d = a[~a['xy'].isin(c['xy'])] 

これは私には不器用だが、これを行うにはよりエレガントな方法は何ですか?

+0

サンプルデータを提供できますか?ここで外側のマージを使うことができると思います。 –

+0

外側のマージは機能しません - 試してみました。ソリューションがデータに依存するのはなぜですか? – Isaac

+0

試行錯誤して最適な解決策を得る。 –

答えて

2

パンダmergeには、データの出所を示すインジケータ列を追加するオプションがあります。これを外側のマージと組み合わせると、探しているものが得られます。いくつかの作らデータフレーム

a_rand = np.reshape(np.random.randint(8,size=40),[10,4]) 
b_rand = np.reshape(np.random.randint(8,size=40),[10,4]) 
a = pd.DataFrame(a_rand, columns = ['x','y','a1','a2']) 
b = pd.DataFrame(b_rand, columns = ['x','y','b1','b2']) 

共有行

pd.merge(a, b, on=['x', 'y']) 
    x y a1 a2 b1 b2 
0 0 6 2 3 1 6 
1 3 1 5 5 0 5 
2 3 0 4 0 3 2 

外に

a_b = pd.merge(a, b, on=['x', 'y'],how="outer",indicator="string") 
a.loc[~(a_b.string=="both"),:] 

テストは行が

最後に、ご希望の
pd.merge(a, b, on=['x', 'y'],how="outer",indicator="string") 
    x y a1 a2 b1 b2 string 
0 0 4 1.0 7.0 NaN NaN left_only 
1 0 4 2.0 1.0 NaN NaN left_only 
2 0 6 2.0 3.0 1.0 6.0 both 
3 5 7 0.0 6.0 NaN NaN left_only 
4 5 7 2.0 5.0 NaN NaN left_only 
5 3 1 5.0 5.0 0.0 5.0 both 
6 3 0 4.0 0.0 3.0 2.0 both 
7 1 5 2.0 5.0 NaN NaN left_only 
8 6 2 0.0 2.0 NaN NaN left_only 
9 4 6 6.0 5.0 NaN NaN left_only 
10 0 5 NaN NaN 0.0 2.0 right_only 
11 1 4 NaN NaN 4.0 4.0 right_only 
12 2 7 NaN NaN 4.0 1.0 right_only 
13 5 6 NaN NaN 7.0 1.0 right_only 
14 3 5 NaN NaN 0.0 0.0 right_only 
15 4 7 NaN NaN 3.0 4.0 right_only 
16 7 2 NaN NaN 3.0 4.0 right_only 

どこから来示す参加します出力

a.loc[~(a_b.string=="both"),:] 

    x y a1 a2 
0 0 4 1 7 
1 0 6 2 3 
3 0 4 2 1 
4 3 1 5 5 
7 1 5 2 5 
8 6 2 0 2 
9 4 6 6 5 
+0

希望の出力は私が探していたものではありませんでしたが、十分に近く、希望の出力を簡単に得ることができました: 'a.loc [(a_b.string ==" left_only ")、:] ' – Isaac

+0

データセットを提供していなかったので、データセットを作成しなければなりませんでした。そして、作成したデータセット 'a.loc [(a_b.string ==" left_only ")、=] a.loc [〜(a_b.string = = "both")、:] '私が 'a.loc [〜(a_b.string ==" both ")、:]を選んだ理由は、それがマージの順序に依存しないからです。言い換えれば、あなたのコードが 'pd.merge(b、a、...' –

関連する問題