2017-08-27 3 views
1

私はpandas 0.20.1とPython 3.6を使用しています。
最初に私の例を確認してください :各列は、いくつかの文字列を持っているforループとexec()を通して一連のマッピングを作成します。

up down 
0 a high 
1 a low 
2 b low 
3 c high 


は、私はという名前のデータフレームを持っていると言います。私がしたいのは、これらの文字列を数字に変換し、データフレーム内の各列のマッピングを格納することです。ある :

up up_id 
0 a  0 
1 b  1 
2 c  2 

    down down_id 
0 high  0 
1 low  1 
column_nameに私の例.IN + '_CODE'の形式でという名前の2つのデータフレームで

up down 
0 0 0 
1 0 1 
2 1 1 
3 2 0 

と保存マッピングは、彼らがup_codedown_codeです

私が試したことは:

cols = ['up', 'down'] 
for col in cols: 
    exec("%(k)s_code = pd.DataFrame({%(k)s:a[col].unique(), %(k)s_id:range(len(a[col].unique()))})" % {'k':col}) 

私はこのマッピングを保存するデータフレームを作成すると期待されるが、それは名前のエラーが発生した:

Traceback (most recent call last): 

    File "<ipython-input-81-7fc8a22fc7f1>", line 2, in <module> 
    exec("%(k)s_code = pd.DataFrame({%(k)s:a[col].unique(), %(k)s_id:range(len(a[col].unique()))})" % {'k':col}) 

    File "<string>", line 1, in <module> 

NameError: name 'up' is not defined 

は、私はここで間違って何をしましたか?それともそれを実現するより簡単な方法がありますか?

答えて

1

Dictのキーは、何かが割り当てられた文字列、数字、または変数でなければなりません。あなたのケースでは、execメソッドの変数を使用するときは、コード(k)s(k)s_id'(k)s''(k)s_id'に変更してください。

cols = ['up', 'down'] 
for col in cols: 
    exec("%(k)s_code = pd.DataFrame({'%(k)s':a[col].unique(), '%(k)s_id':range(len(a[col].unique()))})" % {'k':col}) 
+0

シンプルでわかりやすい! Bharathありがとう! – Sean

+0

ショーンを助ける喜び – Dark

関連する問題