2016-06-07 81 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