2017-12-16 3 views
1

Ich habe eine ganz spezifische Frage bezüglich pandas. Ich habe zwei Datenrahmen, beide sind binär: Ein mehrere Muster enthalten können übereinstimmen sagen:Finden übereinstimmende Spalten in Pandas einschließlich NaNs

0 : 1,NaN,1,Nan,Nan 
1 : Nan,1,1,Nan,Nan 

und eine, die Aufzeichnungen von tatsächlichen Daten

0 : 1,0,0,1,0 
1 : 0,0,0,0,1 
2 : 1,0,1,0,0 

Ich möchte eine Operation auszuführen, die mir sagt, welche Linien der Datensatzdaten übereinstimmen, welche Regeln. In dem Beispiel würde Regel 0 mit Datensatz 2 übereinstimmen. Die fehlenden Werte müssen nicht übereinstimmen, und darin liegt mein Problem: Wenn keine fehlenden Werte vorhanden wären, könnte ich einfach pd.merge(df1,df2,how="inner") verwenden, aber ein innerer Join stimmt nicht überein NaN s mit allem.

Gibt es eine einfache elegante Lösung, ohne alle Schleifen zu machen?

bearbeiten (für Klarheit) hinzuzufügen:

Dieses:

0 : 1,1,NaN,NaN,NaN 

sollte von diesen mit beide überein:

0 : 1,1,0,0,0 
1 : 1,1,0,0,1 
+0

können Sie nach, was Ausgabe, die Sie erreichen wollen? – Tanu

+0

Die gewünschte Ausgabe wäre eine Tabelle mit zwei Zeilen: eine mit der Zeilennummer des übereinstimmenden Datensatzes und eine mit der Zeilennummer der übereinstimmenden Spalte. Ich möchte wissen, dass Rekord zwei mit den Regeln 1,2,3 übereinstimmt; Datensatz 15 entspricht den Regeln 1,2; Ich möchte keine Datensätze sehen, die keiner Regel entsprechen – Blackliquid

Antwort

2

Wenn binär wir duplicated verwenden können

df=pd.concat([df1.fillna(0),df2],keys=['df1','df2']) 
df[df.astype(int).duplicated(keep=False)] 
Out[37]: 
     1 2 3 4 5 
df1 0 1.0 0.0 1 0.0 0.0 
df2 2 1.0 0.0 1 0.0 0.0 

EDIT

dd=df1.stack().reset_index().groupby('level_0').level_1.apply(list).tolist() 
dd 
Out[67]: [['1', '3'], ['2', '3']] 

df2.apply(lambda x : sum([all(x.loc[y]==1) for y in dd]),1) 

Out[78]: 
0 0 
1 0 
2 1 
dtype: int64 
df2[df2.apply(lambda x : sum([all(x.loc[y]==1) for y in dd]),1)==1] 
Out[80]: 
    1 2 3 4 5 
2 1 0 1 0 0 
+0

Ich mag es mit dupliziert! –

+0

Würde es 1,1, Nan, Nan, Nan zu 1,1,0,0,1 tho entsprechen? – Blackliquid

+0

Ich denke, es hat den gleichen Effekt als die innere Verbindung, da Sie die NaNs mit Nullen ausfüllen. Wenn die fehlenden Werte 0 sind, wird es angepasst, aber ich möchte es auch anpassen, auch wenn die fehlenden Werte etwas anderes sind! Nur die angegebenen Werte müssen übereinstimmen, damit die Regel – Blackliquid

Verwandte Themen