python中的外部连接

python中的外部连接,python,numpy,pandas,join,merge,Python,Numpy,Pandas,Join,Merge,我有两个数据集,如下所示 A B IDs IDs 1 1 2 2 3 5 4 7 在Pandas,Numpy中,我们如何应用一个连接,它可以提供来自B的所有数据,而B在a中不存在 像下面这样的 B Ids 5 7 我知道可以用for循环完成,但我不想,因为我的真实数据是数百万,我真的不知道如何在这里使用Panda Numpy,比如 pd.merge(A, B, on='ids', how='right') 谢

我有两个数据集,如下所示

A         B
IDs      IDs
1        1
2        2
3        5
4        7
在Pandas,Numpy中,我们如何应用一个连接,它可以提供来自B的所有数据,而B在a中不存在 像下面这样的

B
Ids
5
7
我知道可以用for循环完成,但我不想,因为我的真实数据是数百万,我真的不知道如何在这里使用Panda Numpy,比如

pd.merge(A, B, on='ids', how='right')
谢谢

您可以使用参数
指示器
,然后。最后您可以合并列
\u

A = pd.DataFrame({'IDs':[1,2,3,4],
                   'B':[4,5,6,7],
                   'C':[1,8,9,4]})
print (A)
   B  C  IDs
0  4  1    1
1  5  8    2
2  6  9    3
3  7  4    4

B = pd.DataFrame({'IDs':[1,2,5,7],
                   'A':[1,8,3,7],
                   'D':[1,8,9,4]})

print (B)
   A  D  IDs
0  1  1    1
1  8  8    2
2  3  9    5
3  7  4    7

df = (pd.merge(A, B, on='IDs', how='outer', indicator=True))
df = df[df._merge == 'right_only']

df = df.drop('_merge', axis=1)
print (df)
    B   C  IDs    A    D
4 NaN NaN  5.0  3.0  9.0
5 NaN NaN  7.0  7.0  4.0
您可以与参数
指示器一起使用
,然后。最后您可以合并列
\u

A = pd.DataFrame({'IDs':[1,2,3,4],
                   'B':[4,5,6,7],
                   'C':[1,8,9,4]})
print (A)
   B  C  IDs
0  4  1    1
1  5  8    2
2  6  9    3
3  7  4    4

B = pd.DataFrame({'IDs':[1,2,5,7],
                   'A':[1,8,3,7],
                   'D':[1,8,9,4]})

print (B)
   A  D  IDs
0  1  1    1
1  8  8    2
2  3  9    5
3  7  4    7

df = (pd.merge(A, B, on='IDs', how='outer', indicator=True))
df = df[df._merge == 'right_only']

df = df.drop('_merge', axis=1)
print (df)
    B   C  IDs    A    D
4 NaN NaN  5.0  3.0  9.0
5 NaN NaN  7.0  7.0  4.0
你可以这样用-

np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
同样,也可以用于相同的效果,就像这样-

np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
请注意,
np.setdiff1d
将给我们一个排序的NumPy数组作为输出

样本运行-

>>> A = pd.DataFrame([1,2,3,4],columns=['IDs'])
>>> B = pd.DataFrame([1,7,5,2],columns=['IDs'])
>>> np.setdiff1d(B['IDs'],A['IDs'])
array([5, 7])
>>> B[~np.in1d(B['IDs'],A['IDs'])]
   IDs
1    7
2    5
你可以这样用-

np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
同样,也可以用于相同的效果,就像这样-

np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
请注意,
np.setdiff1d
将给我们一个排序的NumPy数组作为输出

样本运行-

>>> A = pd.DataFrame([1,2,3,4],columns=['IDs'])
>>> B = pd.DataFrame([1,7,5,2],columns=['IDs'])
>>> np.setdiff1d(B['IDs'],A['IDs'])
array([5, 7])
>>> B[~np.in1d(B['IDs'],A['IDs'])]
   IDs
1    7
2    5

您可以将数据系列转换为集合并取其差异:

import pandas as pd

df=pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
A=set(df['A'])  
B=set(df['B'])
C=pd.DataFrame({'C' : list(B-A)})   # Take difference and convert back to DataFrame 
然后,变量“C”产生

   C
0  5
1  7

您可以将数据系列转换为集合并取其差异:

import pandas as pd

df=pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
A=set(df['A'])  
B=set(df['B'])
C=pd.DataFrame({'C' : list(B-A)})   # Take difference and convert back to DataFrame 
然后,变量“C”产生

   C
0  5
1  7

您只需使用pandas的
.isin()
方法:

df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
df[~df['B'].isin(df['A'])]
如果这些是单独的数据帧:

a = pd.DataFrame({'IDs' : [1,2,3,4]})
b = pd.DataFrame({'IDs' : [1,2,5,7]})
b[~b['IDs'].isin(a['IDs'])]
输出:

   IDs
2    5
3    7

您只需使用pandas的
.isin()
方法:

df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
df[~df['B'].isin(df['A'])]
如果这些是单独的数据帧:

a = pd.DataFrame({'IDs' : [1,2,3,4]})
b = pd.DataFrame({'IDs' : [1,2,5,7]})
b[~b['IDs'].isin(a['IDs'])]
输出:

   IDs
2    5
3    7

尝试代替
right
您可以指定
outer
。预期的输出是什么?列名似乎是A和B,而不是ID。。。这有误导性。请尝试使用
代替。您可以指定
外部
。预期的输出是什么?列名似乎是A和B,而不是ID。。。这是误导,非常感谢!但尽管我多次尝试:“我收到错误,列表索引必须是整数而不是列表”@manusharma那么,除了
IDs
列中的整数之外,你还有什么其他东西吗,比如字符串或整数作为字符串?我有两个大列表/数据帧,其中一些很长,整数,我尝试使用Map(int,dataset)要将所有内容转换为一个,同样的错误列表索引必须是整数而不是列表谢谢!但尽管我多次尝试:“我收到错误,列表索引必须是整数而不是列表”@manusharma那么,除了
IDs
列中的整数之外,你还有什么其他东西吗,比如字符串或整数作为字符串?我有两个大列表/数据帧,其中一些很长,整数,我尝试使用Map(int,dataset)若要将所有内容转换为一个,相同的错误列表索引必须是整数而不是列表