2016-06-07 84 views
1

我有两个数据集如下外python中加入熊猫

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

如何在熊猫,numpy的,我们可以申请一个连接,可以给我从B,这是不存在的 东西全部数据像下面

B 
Ids 
5 
7 

我知道它可以与循环来实现,但我不想,因为我真正的数据是数以百万计,而且我真的不知道如何在这里使用熊猫numpy的,像以下

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

感谢

+0

尝试,而不是'right'你可以指定'outer'。 – shivsn

+0

预期产量是多少?列名似乎是A和B,而不是ID ......这是误导。 –

回答

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 
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 
+0

非常感谢!但尽管我有几次尝试:“我收到错误,列表索引必须是整数而不是列表” –

+0

@manusharma那么,除了'IDs'这一列中的整数之外,还有其他任何东西,比如可能是字符串还是整数? – Divakar

+0

我有两个大型的List/Dataframe,其中一些是long,Integers,我试图用Map(int,dataset)把所有的都转换成一个,还是一样的错误List Indices必须是整数而不是列表 –

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 
1

你可以只需使用熊猫'.isin()方法:

df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]}) 
df[~df['B'].isin(df['A'])] 

如果这些单独DataFrames:

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