다단계 열 인덱스가있는 경우 :
>>> 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