Pivot Table
데이터 컬럼 중 두 개 컬럼을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 조회한 것이다.
Pandas에서는 pivot 함수에 행 인덱스로 사용할 열, 열 인덱스로 사용할 열, 데이터로 사용할 열을 전달하여 pivot table을 생성할 수 있다. Pandas는 지정한 두 열을 행 인덱스와 열 인덱스로 바꾼 후 각 칸마다 행 인덱스와 열 인덱스가 일치하는 각각의 데이터를 찾아 채운다. 만약 데이터가 없으면 NaN 값을 채운다.
pivot 함수 사용
예로 들어 아래와 같은 도시의 연도별 인구 데이터가 있다고 하자.
data = {
"도시": ["서울", "서울", "서울", "부산", "부산", "부산", "인천", "인천"],
"연도": ["2015", "2010", "2005", "2015", "2010", "2005", "2015", "2010"],
"인구": [9904312, 9631482, 9762546, 3448737, 3393191, 3512547, 2890451, 263203],
"지역": ["수도권", "수도권", "수도권", "경상권", "경상권", "경상권", "수도권", "수도권"]
}
columns = ["도시", "연도", "인구", "지역"]
df1 = pd.DataFrame(data, columns=columns)
df1
# 실행 결과
도시 연도 인구 지역
0 서울 2015 9904312 수도권
1 서울 2010 9631482 수도권
2 서울 2005 9762546 수도권
3 부산 2015 3448737 경상권
4 부산 2010 3393191 경상권
5 부산 2005 3512547 경상권
6 인천 2015 2890451 수도권
7 인천 2010 263203 수도권
데이터의 열 인덱스가 도시 이름이고 행 인덱스가 연도가 되면 행, 열 인덱스를 통해 어떤 도시의 어떤 시점의 인구를 쉽게 찾을 수 있을 것 같다. 이 경우에는 아래와 같은 코드로 pivot table을 만들 수 있다.
df1.pivot('도시', '연도', '인구')
df1.pivot(index='도시', columns='연도', values='인구')
# 실행 결과
연도 2005 2010 2015
도시
부산 3512547.0 3393191.0 3448737.0
서울 9762546.0 9631482.0 9904312.0
인천 NaN 263203.0 2890451.0
행 인덱스나 열 인덱스를 리스트로 지정하는 경우에는 다중 인덱스 pivot table을 생성한다.
df1.pivot(['지역', '도시'], '연도', '인구')
df1.pivot(index=['지역', '도시'], columns='연도', values='인구')
# 실행 결과
연도 2005 2010 2015
지역 도시
경상권 부산 3512547.0 3393191.0 3448737.0
수도권 서울 9762546.0 9631482.0 9904312.0
인천 NaN 263203.0 2890451.0
행 인덱스와 열 인덱스는 데이터를 찾는 키이므로, 각 행, 열 인덱스에 해당하는 데이터는 유일해야 한다. 만약 조건을 만족하는 데이터가 여럿인 경우 ValueError가 발생한다.
DataFrame.set_index([idx, col])[[val]].unstack()
pivot 함수가 아니라 set_index와 unstack 함수를 이용해서 pivot table을 생성할 수도 있다.
df1.set_index(["도시", "연도"])[["인구"]].unstack()
# 실행 결과
인구
연도 2005 2010 2015
도시
부산 3512547.0 3393191.0 3448737.0
서울 9762546.0 9631482.0 9904312.0
인천 NaN 263203.0 2890451.0