Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找熊猫的二维补码_Python_Pandas_Dataframe - Fatal编程技术网

Python 寻找熊猫的二维补码

Python 寻找熊猫的二维补码,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个熊猫数据帧,a和b。a和b共享两个公共列,例如x和y,包含英语字符串。x和y的每个组合在a和b中都是uniq。x和y有一个共同的子集,我可以这样计算 c = pandas.merge(a, b, on=['x', 'y']) 我感兴趣的是其余的,d=a-c,应该是a中的行,而不是b中的行,关于x和y两列 我现在要做的是添加另一个柱xy: a['xy'] = a['x'] + a['y'] c['xy'] = c['x'] + c['y'] 然后 d = a[~a['xy'].isin

我有两个熊猫数据帧,a和b。a和b共享两个公共列,例如x和y,包含英语字符串。x和y的每个组合在a和b中都是uniq。x和y有一个共同的子集,我可以这样计算

c = pandas.merge(a, b, on=['x', 'y'])
我感兴趣的是其余的,d=a-c,应该是a中的行,而不是b中的行,关于x和y两列

我现在要做的是添加另一个柱xy:

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

d = a[~a['xy'].isin(c['xy'])]
这对我来说似乎很笨拙,有没有更优雅的方法呢?

熊猫可以选择添加一个指示列,告诉您数据来自何处。将其与外部合并相结合,应该可以得到您想要的

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

你能提供一些样本数据吗?我想你可以在这里使用外部合并。外部合并不起作用-只是尝试一下。为什么解决方案依赖于数据?通过错误试验来获得最佳解决方案。为什么不a[~a.isin(b)].dropna()好吧,这也不起作用。另外,我只对x列和y列感兴趣,a列和b列还有其他列,它们是a列和b列的uniq。所需的输出不是我想要的,但是它足够接近,所以我可以轻松地导出所需的输出:
a.loc[(a_b.string==“left_only”),:]
因为你没有提供数据集,我不得不补充一个数据集,在我制作的数据集中,
a.loc[(a_b.string==“left_only”),:]==a.loc[~(a_b.string==“both”),:]
。我之所以选择
a.loc[~(a_b.string==“both”),:]
是因为它与合并的顺序无关。换句话说,如果您的代码是
pd.merge(b,a,…