2016-06-07 3 views
1

Ich habe zwei Datensätze wie folgtäußere Verbindung in Python Pandas

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

Wie in Pandas, Numpy wir eine Verknüpfung, die mir alle Daten von B geben kann anwenden können, die in einem etwas nicht vorhanden ist

B 
Ids 
5 
7 

wie folgend weiß, dass ich es kann mit for-Schleife durchgeführt werden, aber das will ich nicht, da meine wirklichen Daten in Millionen, und ich bin wirklich nicht sicher, wie Panda Numpy verwenden hier, so etwas wie folgende

Dank

+0

versuchen statt 'right' können Sie festlegen,' outer'. – shivsn

+0

Was ist die erwartete Ausgabe? Die Spaltennamen scheinen A und B zu sein und keine IDs ... das ist irreführend. –

Antwort

2

Sie merge mit dem Parameter indicator und dann boolean indexing verwenden können. Zuletzt können Sie drop Spalte _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

können Sie NumPy's setdiff1d verwenden, wie so -

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

Auch np.in1d für den gleichen Zweck verwendet werden kann, wie so -

B[~np.in1d(B['IDs'],A['IDs'])] 

Bitte beachten Sie, dass uns ein sortiertes NumPy-Array als Ausgabe geben würde.

Probelauf -

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

Vielen Dank! Aber trotz meiner verschiedenen Versuche: "Ich erhalte einen Fehler, List-Indizes müssen ganze Zahlen sein, keine Listen" –

+0

@manusharma Also, hast du noch etwas anderes als Ganzzahlen in dieser Spalte von 'IDs', wie Strings vielleicht oder ganze Zahlen als Strings? – Divakar

+0

Ich habe zwei große Listen/Dataframe, einige von ihnen sind lang, Integer, ich habe versucht, Map (int, Dataset) zu verwenden, um alles in einem zu konvertieren, immer noch die gleichen Fehler Liste Indizes müssen Ganzzahlen nicht Listen sein –

1

Sie könnten die Datenreihe Sätze umwandeln und den Unterschied nehmen:

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 

Die Variable "C" dann

C 
0 5 
1 7 
1

liefert können Sie Verwenden Sie einfach Pandas .isin() Methode:

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

Wenn diese separaten Datenrahmen:

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

Ausgang:

IDs 
2 5 
3 7