2013-05-15 84 views
15

我正在分析一個形狀與以下示例類似的數據集。我有兩個不同類型的數據(ABC數據和XYZ數據):使用.map()有效創建pandas DataFrame中的其他列使用.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 

我想創建一個函數,對於存在於數據幀的每個ABC欄增加了一個歸類列。使用列名稱和類別映射字典列表,我能夠得到我想要的結果。

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 

最終結果是:

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 

雖然for循環結束時工作得很好,我覺得我應該使用Python的lambda功能,但似乎無法推測出來。

有沒有更有效的方法來映射動態數字abc -type columns?

回答

20

您可以使用applymap,從詞典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 

,並把這個給指定的列:

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) 

注意:您可以構造abc_columns相對有效地使用列表理解:

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

安迪,非常感謝! –

+0

@AndyHayden,數據框上的.applymap和熊貓數據框上的.map之間有什麼區別? – yoshiserry

+0

@yoshiserry applymap將它應用於每個單元格,而不是每行/列。 –

相關問題