2017-12-22 21 views
3

データフレームに列を含めることを試みています。 1つの変数を参照する必要があるので、追加するにはMAPツールを使用しています。私はcolumn Dを基準としてXを取っ含めたいデータフレームにMAPと辞書を使用する列を含める

X  Y   Z 
    xx high   10 
     slow   20 
     fat   30 
    xy high   15 
     slow   10 
     fast   30 

はここで、現在のデータフレームです。この新しい列は、次の値を持つ辞書(辞書)に基づくべきである:

{'xx': -4.50, 'xy': -10.21} 

は、だから私がやった:私は、コードを実行すると

df['D'] = df['X'].map(dicc) 

ただし、メッセージがKeyError: 'X'が表示されます。コードで何かが見つからないか、データ型(str/float)に問題がありますか?

ご協力いただければ幸いです。 ありがとう!

EDIT: 私は、参照(コメントに感謝)としてXYを取っGROUPBYからデータフレームを取得します。

+0

'X'は、インデックス、いない列のようです。 –

答えて

2

あなたはそれを

df = pd.DataFrame({'X':['xx', 'xx', 'xx', 'xy', 'xy', 'xy'], 
        'Y':['high', 'slow', 'fat']*2, 
        'Z':[10, 20, 30, 15, 10, 30]}) 

dicc = {'xx': -4.5, 'xy':-10.21} 

df['D'] = [dicc[i] for i in df['X']] 

電子 エキストラを行うには、簡単なリスト内包を使用することができます:あなたのDFはgroubyから来て、それが列「X」を見つけることができないため、コードがエラーを言う、それはだ場合'X'は現在インデックス列になっているためです。これを修正するには、df = df.reset_index()と答えて、あなたのDFをこの回答のように見せてください。

1

あなたはmapを使用しますが、最初にすることができますが、MultiIndexto_seriesの必要な変換レベルです:

dicc = {'xx': -4.50, 'xy': -10.21} 

L = [df.index.get_level_values('X').to_series().map(dicc), 
    df.index.get_level_values('Y')] 

df.index = pd.MultiIndex.from_arrays(L, names = df.index.names) 
#alternative solution 
#df = df.set_index(pd.MultiIndex.from_arrays(L, names = df.index.names)) 


print (df) 
       Z 
X  Y  
-4.50 high 10 
     slow 20 
     fat 30 
-10.21 high 15 
     slow 10 
     fast 30 
関連する問題