2017-05-30 5 views
1

Ich habe einen Datenrahmen, dem ich eine Spalte mit einer Art Status hinzufügen möchte, wenn ein anderer Wert in einem anderen Datenrahmen vorhanden ist. Ich habe den aktuellen Code, der funktioniert:Pandas DataFrame Apply Effizienz

df1['NewColumn'] = df1['ComparisonColumn'].apply(lambda x: 'Match' if any(df2.ComparisonColumn == x) else ('' if x is None else 'Missing')) 

Ich weiß, die Linie ist hässlich, aber ich habe den Eindruck, dass es ineffizient ist. Können Sie einen besseren Vergleich vorschlagen?

Antwort

1

können Sie verwenden np.where, isin und isnull:

einige Dummy-Daten erstellen:

np.random.seed(123) 
df = pd.DataFrame({'ComparisonColumn':np.random.randint(10,20,20)}) 
df.iloc[4] = np.nan #Create missing data 
df2 = pd.DataFrame({'ComparisonColumn':np.random.randint(15,30,20)}) 

Sie passend mit np.where:

df['NewColumn'] = np.where(df.ComparisonColumn.isin(df2.ComparisonColumn),'Matched',np.where(df.ComparisonColumn.isnull(),'Missing','')) 

Ausgang:

ComparisonColumn NewColumn 
0    12.0   
1    12.0   
2    16.0 Matched 
3    11.0   
4    NaN Missing 
5    19.0 Matched 
6    16.0 Matched 
7    11.0   
8    10.0   
9    11.0   
10    19.0 Matched 
11    10.0   
12    10.0   
13    19.0 Matched 
14    13.0   
15    14.0   
16    10.0   
17    10.0   
18    14.0   
19    11.0   
+0

Vielen Dank dafür - ich habe es implementiert und es ist ein bisschen schneller und es ist definitiv klarer. Kannst du sagen, warum es schneller ist? Etwas, das vielleicht in meinem ursprünglichen Beitrag fehlt, ist, dass die Vergleiche Textvergleiche sind. Es scheint lustig zu sein, mit numpy Textvergleiche durchzuführen. – user3535074

+0

@ user3535074 Ja, anwenden ist im Allgemeinen eine etwas langsame Operation, ich benutze nur Numpy für wenn dann Kontrolle und der Vergleich findet mit Pandas und Isin-Funktion statt. –