2013-05-15 6 views
15

次の例と同様の形状のデータセットを解析しています。私は2つの異なるデータの種類(ABCデータとXYZデータ)を持っている:map()を使用してpandas DataFrameに追加の列を効率的に作成する

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型の動的数値をより効率的にマッピングする方法はありますか?

答えて

20

あなたは辞書get方法でapplymapを使用することができます。

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とpandasデータフレームの.mapの違いは何ですか? – yoshiserry

+0

@yoshiserry applymapは、各行/ colではなく、各セルに適用します。 –

関連する問題