2013-05-15 13 views
15

Analizuję zestaw danych, który jest podobny do następującego przykładu. Mam dwa różne typy danych (abc danych i xyz dane):Efektywne tworzenie dodatkowych kolumn w pandach DataFrame przy użyciu .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 

Chcę utworzyć funkcję, która dodaje kolumnę kategoryzowania dla każdego abc kolumny, która istnieje w dataframe. Używając list nazw kolumn i słownika mapowania kategorii, udało mi się uzyskać pożądany wynik.

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 

Wynik końcowy:

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 

Podczas gdy pętla na końcu for działa dobrze, czuję się jak należy używać lambda funkcji Pythona, ale nie potrafię zrozumieć.

Czy istnieje skuteczniejszy sposób mapowania w dynamicznej liczbie kolumn o rozmiarze abc?

Odpowiedz

20

Można użyć applymap metodą słowniku get:

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 

i umieścić ten do określonych kolumn:

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) 

Uwaga: można skonstruować abc_columns stosunkowo skutecznie używając wyrażeń listowych:

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

Andy, wielkie dzięki! –

+0

@AndyHayden, jaka jest różnica między .applymap na ramce danych i .map na pandasowej ramce danych? – yoshiserry

+0

@yoshiserry applymap robi to do każdej komórki, a nie do każdego wiersza/kolumny. –

Powiązane problemy