2013-05-15 11 views
15

Aşağıdaki örnekte benzer bir veri kümesini analiz ediyorum.DataFrame kullanarak bir pandada ek sütun oluşturma .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 

I dataframe içinde bulunan her abc sütun için bir sınıflandırma sütun ekler bir işlev oluşturmak istiyorum: iki farklı veri tipleri (ABC veri ve xyz veri) sahiptir. Sütun isimleri ve kategori eşleme sözlüğü listelerini kullanarak, istediğim sonucu elde edebildim.

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 

Sonuç: sonunda for döngü çalışıyor

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 

ederken, ben Python'un lambda işlevini kullanarak gerektiğini fakat onu anlamaya gibi olamaz gibi hissediyorum.

abc -type sütunları dinamik sayısında eşlemek için daha verimli bir yol var mı?

cevap

20

Sen Sözlük get yöntemi ile applymap kullanabilirsiniz:

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 

Ve belirtilen sütunlara bu koyun: nispeten verimli bir liste anlama kullanarak abc_columns oluşturabilirsiniz:

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) 

Not

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

Andy, çok teşekkürler! –

+0

@AndyHayden, bir dataframe üzerindeki .applymap ve pandas dataframe'deki .map arasındaki fark nedir? – yoshiserry

+0

@yoshiserry applymap, her satır/sütun yerine her bir hücreye yapar. –

İlgili konular