2017-12-22 3 views
3

데이터 프레임에 열을 포함하려고합니다. 하나의 변수를 참조해야하기 때문에 추가하려면 MAP 도구를 사용하고 있습니다. 나는 column D 참조로 X을 복용하고 싶으데이터 프레임에 MAP 및 사전을 사용하는 열 포함

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

:

다음은 현재 dataframe입니다. 이 새로운 열은 다음과 같은 값으로 딕셔너리 (사전)을 기반으로해야합니다 :

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

그래서 내가 한 : 나는이 코드를 실행하면

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

그러나 메시지가 KeyError: 'X' 나타납니다. 코드에서 뭔가가 누락되었거나 데이터 유형 (str/float)에 문제가 있습니까?

도움을 주시면 감사하겠습니다. 감사합니다.

편집 : 내가 참고로 (주석에 대한 감사) XY을 복용 GROUPBY에서 dataframe를 얻을.

+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 = df.reset_index()라고 말하면됩니다.

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 
관련 문제