[python] 팬더 : 다단계 열 색인에서 수준을 삭제 하시겠습니까?

다단계 열 인덱스가있는 경우 :

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
    ㅏ
   --- +-
    b | 씨
-+ --- +-
0 | 1 | 2
1 | 3 | 4

해당 인덱스의 “a”수준을 어떻게 떨어 뜨릴 수 있습니까?

    b | 씨
-+ --- +-
0 | 1 | 2
1 | 3 | 4



답변

당신은 사용할 수 있습니다 MultiIndex.droplevel:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]


답변

인덱스를 삭제하는 또 다른 방법은 목록 이해를 사용하는 것입니다.

df.columns = [col[1] for col in df.columns]

   b  c
0  1  2
1  3  4

이 전략은 아래 레벨과 같이 두 레벨의 이름을 결합하려는 경우에도 유용합니다. 맨 아래 레벨에는 두 개의 ‘y’가 있습니다.

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)

   A     B
   x  y  y
0  1  2  8
1  3  4  9

최상위 수준을 삭제하면 인덱스 ‘y’가있는 두 개의 열이 남습니다. 목록 이해와 이름을 결합하여 피할 수 있습니다.

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

    A_x A_y B_y
0   1   2   8
1   3   4   9

그것은 그룹화를 한 후에 내가 겪었던 문제이며 그것을 해결 한 다른 질문 을 찾는 데 시간 걸렸 습니다. 이 솔루션을 특정 사례에 맞게 조정했습니다.


답변

이 작업을 수행하는 또 다른 방법 은 .xs 방법을 사용하여의 df단면을 기반으로 다시 할당 하는 것입니다.df

>>> df

    a
    b   c
0   1   2
1   3   4

>>> df = df.xs('a', axis=1, drop_level=True)

    # 'a' : key on which to get cross section
    # axis=1 : get cross section of column
    # drop_level=True : returns cross section without the multilevel index

>>> df

    b   c
0   1   2
1   3   4


답변

Pandas 0.24.0부터는 이제 DataFrame.droplevel ()을 사용할 수 있습니다 .

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)

df.droplevel(0, axis=1)

#   b  c
#0  1  2
#1  3  4

이것은 DataFrame 메서드 체인 롤링을 유지하려는 경우에 매우 유용합니다.


답변

열의 이름을 변경하여이를 달성 할 수도 있습니다.

df.columns = ['a', 'b']

여기에는 수동 단계가 포함되지만 특히 데이터 프레임의 이름을 바꾸려는 경우 옵션이 될 수 있습니다.


답변

sum level = 1과 함께 사용하는 작은 트릭 (level = 1이 모두 고유 한 경우 작동)

df.sum(level=1,axis=1)
Out[202]:
   b  c
0  1  2
1  3  4

더 일반적인 솔루션 get_level_values

df.columns=df.columns.get_level_values(1)
df
Out[206]:
   b  c
0  1  2
1  3  4


답변

droplevel () 함수가 작동하지 않는 이유를 모르기 때문에이 문제로 어려움을 겪었습니다. 여러 작업을 수행하고 테이블의 ‘a’는 열 이름이고 ‘b’, ‘c’는 색인이라는 것을 배우십시오. 이렇게하면 도움이 될 것입니다

df.columns.name = None
df.reset_index() #make index become label