본문 바로가기
Python/Python FAQ

Python 열에 계층적 인덱스를 평평하게 만드는 방법, How to flatten a hierarchical index in columns

by 베타코드 2023. 10. 7.
반응형

질문


나는 axis 1 (열)에서 계층적 인덱스를 가진 데이터 프레임을 가지고 있습니다 (groupby.agg 작업에서).

     USAF   WBAN  year  month  day  s_PC  s_CL  s_CD  s_CNT  tempf       
                                     sum   sum   sum    sum   amax   amin
0  702730  26451  1993      1    1     1     0    12     13  30.92  24.98
1  702730  26451  1993      1    2     0     0    13     13  32.00  24.98
2  702730  26451  1993      1    3     1    10     2     13  23.00   6.98
3  702730  26451  1993      1    4     1     0    12     13  10.04   3.92
4  702730  26451  1993      1    5     3     0    10     13  19.94  10.94

나는 이것을 펼치고 싶습니다. 다음과 같이 보이게 하려면 (이름은 중요하지 않습니다 - 이름을 바꿀 수 있습니다):

     USAF   WBAN  year  month  day  s_PC  s_CL  s_CD  s_CNT  tempf_amax  tmpf_amin   
0  702730  26451  1993      1    1     1     0    12     13  30.92          24.98
1  702730  26451  1993      1    2     0     0    13     13  32.00          24.98
2  702730  26451  1993      1    3     1    10     2     13  23.00          6.98
3  702730  26451  1993      1    4     1     0    12     13  10.04          3.92
4  702730  26451  1993      1    5     3     0    10     13  19.94          10.94

어떻게 해야 할까요? (많이 시도했지만 얻는 게 없었습니다.)

제안에 따라 여기에 딕셔너리 형태의 head가 있습니다.

{('USAF', ''): {0: '702730',
  1: '702730',
  2: '702730',
  3: '702730',
  4: '702730'},
 ('WBAN', ''): {0: '26451', 1: '26451', 2: '26451', 3: '26451', 4: '26451'},
 ('day', ''): {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
 ('month', ''): {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
 ('s_CD', 'sum'): {0: 12.0, 1: 13.0, 2: 2.0, 3: 12.0, 4: 10.0},
 ('s_CL', 'sum'): {0: 0.0, 1: 0.0, 2: 10.0, 3: 0.0, 4: 0.0},
 ('s_CNT', 'sum'): {0: 13.0, 1: 13.0, 2: 13.0, 3: 13.0, 4: 13.0},
 ('s_PC', 'sum'): {0: 1.0, 1: 0.0, 2: 1.0, 3: 1.0, 4: 3.0},
 ('tempf', 'amax'): {0: 30.920000000000002,
  1: 32.0,
  2: 23.0,
  3: 10.039999999999999,
  4: 19.939999999999998},
 ('tempf', 'amin'): {0: 24.98,
  1: 24.98,
  2: 6.9799999999999969,
  3: 3.9199999999999982,
  4: 10.940000000000001},
 ('year', ''): {0: 1993, 1: 1993, 2: 1993, 3: 1993, 4: 1993}}

답변


이것을 수행하는 가장 쉬운 방법은 열을 최상위 레벨로 설정하는 것입니다:

df.columns = df.columns.get_level_values(0)

참고: 최상위 레벨에 이름이 있는 경우 0 대신 이를 통해 액세스할 수도 있습니다.

.

MultiIndex를 하나의 인덱스로 결합/결합하려는 경우 join (열에 문자열 항목만 있는 경우)을 사용할 수 있습니다:

df.columns = [' '.join(col).strip() for col in df.columns.values]

참고: 두 번째 인덱스가 없는 경우 공백을 제거해야 합니다.

In [11]: [' '.join(col).strip() for col in df.columns.values]
Out[11]: 
['USAF',
 'WBAN',
 'day',
 'month',
 's_CD sum',
 's_CL sum',
 's_CNT sum',
 's_PC sum',
 'tempf amax',
 'tempf amin',
 'year']
반응형

댓글