HOWTO · Pandas
Pandas Dataframe의 색인을 열로 변환하는 방법
Pandas DataFrame의 인덱스를 `df.index` 또는 `reset_index()`로 열에 추가하고, `rename_axis()`로 열 이름을 지정하며, `MultiIndex`의 각 레벨을 열로 변환하는 방법을 알아봅니다.
이 페이지의 내용
DataFrame의 인덱스 값을 일반 열로 추가하려면 reset_index()를 사용하세요. 이 메서드는 기존 인덱스를 하나 이상의 열로 옮기고 기본 정수 인덱스를 사용하는 새 DataFrame을 반환합니다. 기존 인덱스를 유지하면서 그 값을 열에 복사하려면 df.index를 대신 할당하세요. 인덱스를 초기화하기 전에 인덱스 열의 이름을 정하려면 rename_axis()를 사용하면 됩니다. 같은 reset_index() 작업으로 MultiIndex의 모든 레벨도 각각 열로 바꿀 수 있습니다.
df.index로 인덱스를 열로 추가
df.index를 할당하면 인덱스 값이 열에 복사되고 DataFrame의 인덱스는 그대로 유지됩니다. 인덱스를 행 레이블과 데이터 양쪽에서 모두 사용해야 할 때 유용합니다. 여기서는 새 열 이름을 index로 지정했습니다. 데이터의 의미를 더 잘 나타내는 이름이 있다면 그 이름을 선택하세요. 다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [8, 9]}, index=[101, 102])
df["index"] = df.index
print(df.to_dict(orient="records"))
print("row labels:", df.index.tolist())
[{'name': 'Ada', 'score': 8, 'index': 101}, {'name': 'Lin', 'score': 9, 'index': 102}]
row labels: [101, 102]
레코드에서 복사된 값을 확인할 수 있고, 두 번째 줄에서는 원래 행 레이블이 유지된 것을 볼 수 있습니다. 이 할당은 새로운 기본 인덱스를 만들지 않습니다. 선택한 이름의 열이 이미 있다면 기존 데이터를 덮어쓰지 않도록 다른 열 이름을 고르세요.
reset_index로 인덱스를 열로 추가
reset_index()를 호출하면 인덱스 값이 반환되는 DataFrame의 열로 이동합니다. 이름이 지정된 인덱스라면 그 이름이 열 이름으로 사용됩니다. 이름이 없는 인덱스라면 index라는 이름을 사용할 수 있을 때 pandas가 이를 열 이름으로 사용합니다. 결과를 원본에 다시 할당하지 않는 한 이 작업은 원본 DataFrame을 변경하지 않습니다. 새 구조를 명확히 하려면 결과를 변수에 할당하세요. 다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
df = pd.DataFrame({"score": [8, 9]}, index=pd.Index([101, 102], name="record_id"))
converted = df.reset_index()
print(converted.to_dict(orient="records"))
print("columns:", converted.columns.tolist())
[{'record_id': 101, 'score': 8}, {'record_id': 102, 'score': 9}]
columns: ['record_id', 'score']
기본적으로 결과에는 0부터 시작하는 새 정수 인덱스가 지정됩니다. 인덱스는 초기화하되 기존 인덱스를 열로 보존하지 않으려면 reset_index(drop=True)를 사용하세요. 생성될 인덱스 열 이름이 기존 열과 겹치면 초기화하기 전에 둘 중 하나의 이름을 바꾸세요.
rename_axis로 인덱스 열 이름 지정
rename_axis()로 인덱스 이름을 설정한 다음 reset_index()를 호출하면 그 이름이 새 열에 사용됩니다. 원본 인덱스에 이름이 없어도 이 방법을 쓸 수 있습니다. 연쇄 호출은 Series가 아니라 DataFrame을 반환하므로 다른 열과 해당 행 값도 유지됩니다. 다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
df = pd.DataFrame({"city": ["Oslo", "Lima"], "visitors": [12, 7]}, index=[1, 2])
converted = df.rename_axis("site_id").reset_index()
print(converted.to_dict(orient="records"))
[{'site_id': 1, 'city': 'Oslo', 'visitors': 12}, {'site_id': 2, 'city': 'Lima', 'visitors': 7}]
인덱스를 만들 때 이름을 직접 지정할 수도 있지만, DataFrame이 이미 있거나 변환 단계를 한데 이어서 표현하고 싶을 때는 rename_axis()가 편리합니다. reset_index()의 매개변수와 반환 동작은 DataFrame의 reset_index 참조를 확인하세요.
MultiIndex를 열로 변환
MultiIndex는 둘 이상의 레벨로 구성된 행 레이블을 저장합니다. reset_index()를 호출하면 각 레벨이 별도의 열로 이동하며, 레벨 간 조합과 연결된 값은 그대로 유지됩니다. 일반 열을 기대하는 형식으로 데이터를 내보내거나 다른 데이터와 결합하기 전에 유용합니다. 다음의 결정적인 예제에서는 이름이 지정된 두 레벨을 변환합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
index = pd.MultiIndex.from_tuples(
[("North", "A"), ("North", "B"), ("South", "A")],
names=["region", "code"],
)
df = pd.DataFrame({"sales": [5, 8, 3]}, index=index)
converted = df.reset_index()
print(converted.to_dict(orient="records"))
[{'region': 'North', 'code': 'A', 'sales': 5}, {'region': 'North', 'code': 'B', 'sales': 8}, {'region': 'South', 'code': 'A', 'sales': 3}]
기존 인덱스 레벨은 각각 별도의 열이 되고, sales 값은 원래의 지역 및 코드와 계속 연결됩니다. 일반 열을 인덱스로 옮기려는 경우에는 set_index()를 사용합니다. 이는 여기서 설명한 변환과 반대 방향의 작업입니다.