在熊猫中找到二维补码

时间:2017-12-12 10:47:50

标签: python pandas dataframe

我有两个pandas数据帧,a和b。 a和b共享两个共同的列,例如x和y,包含英语字符串。 x和y的每个组合在a和b内是uniq。有一个x和y的共同子集,我可以像

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

我感兴趣的是剩下的,d = a - c,相对于两列x和y,它应该是不在b中的行。

我目前所做的是添加另一个colum xy:

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

然后

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

这对我来说似乎很笨拙,有没有更优雅的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

Pandas merge可以选择添加一个指示符列,告诉您数据的来源。将它与外部合并相结合可以为您提供所需的内容。

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

测试一些组成的数据帧

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

外部联接显示行来自哪里

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