2013-05-15 4 views
15

다음 예제와 모양이 유사한 데이터 세트를 분석합니다..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 

내가 dataframe에 존재하는 각 ABC 열에 대한 범주화 컬럼을 추가하는 기능을 만들려 : I는 데이터의 두 가지 유형 (ABC 데이터 XYZ 데이터)를 갖는다. 열 이름 목록과 범주 매핑 사전을 사용하여 원하는 결과를 얻을 수있었습니다.

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 

최종 결과 : 마지막에 for 루프가 잘 작동

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 

동안, 나는 파이썬의 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 

그리고 지정된 열이를 넣어 : 상대적으로 효율적으로 지능형리스트를 이용하여 당신이 abc_columns을 구성 할 수 있습니다 :

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 = [col for col in df.columns if str(col).startswith('abc')] 
+0

앤디, 정말 고마워요! –

+0

@AndyHayden, 데이터 프레임의 .applymap과 팬더 데이터 프레임의 .map의 차이점은 무엇입니까? – yoshiserry

+0

@yoshiserry applymap은 각 행/열이 아닌 각 셀에 적용합니다. –

관련 문제