外部加入python Pandas

时间:2016-06-07 13:02:49

标签: python numpy pandas join merge

我有两个数据集如下

A         B
IDs      IDs
1        1
2        2
3        5
4        7

如何在Pandas,Numpy中我们可以应用一个可以给我B的所有数据的连接,这在A中不存在 跟随

之类的东西
B
Ids
5
7

我知道可以用for循环完成,但我不想要,因为我的真实数据是数百万,而我真的不确定如何在这里使用Panda Numpy,类似于

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

谢谢

4 个答案:

答案 0 :(得分:3)

您可以使用NumPy's setdiff1d,就像这样 -

np.setdiff1d(B['IDs'],A['IDs'])

此外,np.in1d可以用于相同的效果,如此 -

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

答案 1 :(得分:2)

您可以将merge与参数indicator一起使用,然后再使用boolean indexing。最后您可以drop_merge

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您只需使用pandas'def zeros(n) zeros = 0 zeros += n /= 5 while n >= 1 zeros end 方法:

.isin()

如果这些是单独的DataFrames:

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'])]