2017-02-20 7 views
2

Größe habe ich einige Probleme zwei Datenrahmen in der Art und Weise zu vergleichen, ich möchte:vergleichen Kreuzung bestimmter Spalten von Datenrahmen unterschiedlicher

df1=pd.DataFrame({"code1": ['A', 'B', 'C', 'C','D'], 
       "code2": ["1", "0", "1", "1","1"], 
       "column1":['value1','value2','value3','value4','value5']}) 

    code1 code2 column1 
    0  A  1 value1 
    1  B  0 value2 
    2  C  1 value3 
    3  C  1 value4 
    4  D  1 value5 

df2 = pd.DataFrame({"code1": ['A','B','C'], 
       "code2": ["0", "0", "1"], 
       "column2":['valuex','valuey','valuez']}) 

    code1 code2 column2 
    0  A  0 valuex 
    1  B  0 valuey 
    2  C  1 valuez 

Dies sind die beiden Datenrahmen ich vergleichen möchten. Ich brauche etwas zu tun, wie

df1[['code1','code2']].isin(df2[['code1','code2']]) 

mit dem Ziel des Erhaltens das Ergebnis:

 code1 code2 column1 
    0  B  0 value2 
    1  C  1 value3 
    2  C  1 value4 

Ich möchte sowohl die Zeilen mit gleichen ‚code1‘ und ‚code2‘ in DF1 und DF2 erhalten, und die anderen Spalten von df1. Kennen Sie den besten Weg, dies zu tun? Ich möchte Schleifen vermeiden, ich brauche es effizient. Vielen Dank im Voraus

Antwort

0

Sie können einfach verwenden merge() Methode:

In [30]: cols = ['code1','code2'] 

In [31]: pd.merge(df1, df2[cols], on=cols) 
Out[31]: 
    code1 code2 column1 
0  B  0 value2 
1  C  1 value3 
2  C  1 value4 

UPDATE:

was ist, wenn ich die gelöschten Fälle in einem anderen Datenrahmen behalten wollen?

In [62]: pd.merge(df1, df2[cols], on=cols, how='left', indicator=True).query("_merge == 'left_only'") 
Out[62]: 
    code1 code2 column1  _merge 
0  A  1 value1 left_only 
4  D  1 value5 left_only 
+0

OK danke! Und was, wenn ich die gelöschten Fälle in einem anderen Datenrahmen behalten möchte ??? –

+0

@ emilio.molina, siehe UPDATE – MaxU

+0

perfekt, vielen Dank !! also 'Indikator' ist der Parameter, der entscheidet, welcher Teil des Datenrahmens du konservierst, nicht wahr? –

0

ich den Index auf die Spalt gesetzt würde Sie wollen, und führen Sie einen Join:

df1=df1.set_index(['code1','code2'])  
df2=df2.set_index(['code1','code2']) 
In [90]: df1.join(df2) 
Out[90]: 
      column1 column2 
code1 code2     
A  1  value1  NaN 
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 
D  1  value5  NaN 

Um den NaN loszuwerden: dropna

df1.join(df2) 
Out[94]: 
      column1 column2 
code1 code2     
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 

und dann Sie könnten den Index verwerfen, wenn Sie es nicht wollen mit reset_index():

df1.join(df2).dropna().reset_index() 
Out[95]: 
    code1 code2 column1 column2 
0  B  0 value2 valuey 
1  C  1 value3 valuez 
2  C  1 value4 valuez 
+0

das ist in Ordnung. Vielen Dank. Ich habe jedoch zwei Probleme. Erstens habe ich die Frage in diesem Sinne gestellt, aber eigentlich wollte ich die anderen Werte beibehalten, d. H. Die Werte mit NaN in Spalte 2. Mein zweites Problem ist, dass df2 viele Spalten hat (63). So macht es so, dass ich alle hinzugefügten Spalten löschen muss, etwas ganz Schreckliches .... –

+0

Übrigens, es tut mir leid, aber ich kann keine Punkte hinzufügen, bis ich 15 Reputation bekomme, also kann ich deine Antwort nicht akzeptieren. Ich bin mir sicher, dass jemand anderes es tun wird, mach dir keine Sorgen –

+0

ok ich habe es getan. Aber obwohl Ihre Antwort nützlich war, löst sie nicht vollständig mein Problem und ich würde gerne andere Antworten bekommen ... Ich weiß nicht, ob andere sich um diese Frage kümmern werden, wenn sie als gelöst markiert wurde ... –

Verwandte Themen