2017-09-25 2 views
3

이름 바꾸기 :팬더, (데이터의 순서가 변경)을 multiindex 열 나는 다음 dataframe해야합니까

{'e1.data_280': {0: 10, 1: 20, 2: 30}, 
'e1.data_603': {0: 7, 1: 8, 2: 9}, 
'e2.data_280': {0: 30, 1: 20, 2: 10}, 
'e2.data_603': {0: 8, 1: 9, 2: 1}} 

후를 :

enter image description here

: 그것은처럼 보이는

df.columns = df.columns.str.split('.', expand=True) 

이제 data_이라는 문구를 제거하고 싶습니다.

는 세 자리 밑줄 뒤에 얻을 : 데이터가 변경

df.columns.set_levels(cols, level=1, inplace=True) 

: 나는 기존의 라벨을 교체 할 경우

cols = [item.split('_')[1] for item in df.columns.get_level_values(1)] 
cols 
['603', '280', '603', '280'] 

enter image description here

내가 cols를 볼 수준 1의 멀티 색인 이름보다 많은 항목이 있습니다 :

MultiIndex(levels=[['e1', 'e2'], ['data_280', 'data_603']], 
      labels=[[0, 0, 1, 1], [1, 0, 1, 0]]) 

그러나 데이터 프레임에서 첫 번째 수준의 multiindex 열의 이름을 바꾸려면 어떻게해야합니까?

편집 : 해결 방법

df.unstack().reset_index() 

함께 열 및 분할 열 값을 이름 바꾸기와 함께 작동합니다 : 당신은 cols = [item.split('_')[1] for item in df.columns.levels[1]]을 사용할 수 있습니다

+1

코드를 실행할 때 원하는 결과가 나타나는 것 같습니다. – GiantsLoveDeathMetal

+0

그러나'inplace = True'를 전달할 때 오류가 발생하지만 원하는 df는 내가 없으면 얻을 수 있습니다. – GiantsLoveDeathMetal

+0

@GiantsLoveDeathMetal 어떤 팬더 버전을 실행하고 있습니까? – Moritz

답변

3

설정

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

옵션 1
가장 쉬운 것은 첫 번째 분할에 그것을 포함 봤는데 것이다.

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

df.columns = df.columns.str.split('.data_', expand=True) 

df 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

옵션 2
사실 후에는

df.rename(columns=lambda x: x.replace('data_', '')) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

당신은 심지어 level를 전달하여 rename의 범위를 좁힐 수 있습니다 할 수 있습니다. 이렇게하면 level=0 열 개체에 replace을 수행하지 않습니다.

df.rename(columns=lambda x: x.replace('data_', ''), level=1) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 
0

; 이것은 정렬을 유지합니다.

+0

'cols'를 만들 때 그 같은 순서로 사전을 쓰면 운이 좋았나요? – GiantsLoveDeathMetal

+0

나는 그렇게 생각하지 않지만, 레벨 0의 두 값이 레벨 1에서 다른 값의 부분 집합을 가지면 접근이 실패해야합니다. –