パンダ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
サンプルデータを提供できますか?ここで外側のマージを使うことができると思います。 –
外側のマージは機能しません - 試してみました。ソリューションがデータに依存するのはなぜですか? – Isaac
試行錯誤して最適な解決策を得る。 –