2013-05-15 22 views
15

Ich analysiere einen Datensatz, der in seiner Form dem folgenden Beispiel ähnelt. Ich habe zwei verschiedene Arten von Daten (abc Daten und xyz Daten):Effizientes Erstellen zusätzlicher Spalten in einem Pandas DataFrame mit .map()

abc1 abc2 abc3 xyz1 xyz2 xyz3 
0  1  2  2  2  1  2 
1  2  1  1  2  1  1 
2  2  2  1  2  2  2 
3  1  2  1  1  1  1 
4  1  1  2  1  2  1 

Ich möchte eine Funktion erstellen, die eine Kategorisierungs Spalte für jede abc Spalte ergänzt, die in der Datenrahmen existiert. Mithilfe von Listen mit Spaltennamen und einem Wörterbuch für die Kategoriezuordnung konnte ich das gewünschte Ergebnis erzielen.

abc_columns = ['abc1', 'abc2', 'abc3'] 
xyz_columns = ['xyz1', 'xyz2', 'xyz3'] 
abc_category_columns = ['abc1_category', 'abc2_category', 'abc3_category'] 
categories = {1: 'Good', 2: 'Bad', 3: 'Ugly'} 

for i in range(len(abc_category_columns)): 
    df3[abc_category_columns[i]] = df3[abc_columns[i]].map(categories) 

print df3 

Das Endergebnis:

abc1 abc2 abc3 xyz1 xyz2 xyz3 abc1_category abc2_category abc3_category 
0  1  2  2  2  1  2   Good   Bad   Bad 
1  2  1  1  2  1  1   Bad   Good   Good 
2  2  2  1  2  2  2   Bad   Bad   Good 
3  1  2  1  1  1  1   Good   Bad   Good 
4  1  1  2  1  2  1   Good   Good   Bad 

Während die for Schlaufe am Ende funktioniert gut, ich fühle mich wie sollte ich lambda Funktion Python verwenden, aber kann nicht scheinen, um es herauszufinden.

Gibt es eine effizientere Möglichkeit, eine dynamische Anzahl von abc-Typ-Spalten zuzuordnen?

Antwort

20

Sie applymap mit dem Wörterbuch get Methode verwenden:

In [11]: df[abc_columns].applymap(categories.get) 
Out[11]: 
    abc1 abc2 abc3 
0 Good Bad Bad 
1 Bad Good Good 
2 Bad Bad Good 
3 Good Bad Good 
4 Good Good Bad 

Und diese Spalten auf die angegebenen setzen:

In [12]: abc_categories = map(lambda x: x + '_category', abc_columns) 

In [13]: abc_categories 
Out[13]: ['abc1_category', 'abc2_category', 'abc3_category'] 

In [14]: df[abc_categories] = df[abc_columns].applymap(categories.get) 

Hinweis: Sie abc_columns relativ effizient mit einer Liste Verständnis konstruieren kann:

abc_columns = [col for col in df.columns if str(col).startswith('abc')] 
+0

Andy, vielen Dank! –

+0

@AndyHayden, was ist der Unterschied zwischen .applymap auf einem Datenrahmen und .map auf einem Pandas Datenrahmen? – yoshiserry

+0

@yoshiserry applymap tut es für jede Zelle, anstatt jede Zeile/Spalte. –

Verwandte Themen