Python/NumPy | Pandas

[Python] Pandas - 피봇테이블과 그룹분석 1

비번변경 2022. 12. 30. 00:15

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

 

 

참고 문서

데이터 사이언스 스쿨 - 4.7 피봇 테이블과 그룹 분석