기타


1
import pandas as pd
1
df = pd.read_csv('korean-idol.csv')

1. 피벗테이블

  • 데이터 열 중에서 두 개의 열을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 조회하여 펼쳐놓은 건을 의미함
  • 왼쪽에 나타나는 인덱스를 행 인덱스, 상단에 나타나는 인덱스를 열 인덱스라고 부른다

pd.pivot_table(df_name, index = “col_name_분류기준1”, columns = “col_name_분류기준2”, values = “col_name_조회대상”, aggfunc = …)

  • index는 행 인덱스
  • columns는 열 인덱스
  • values는 조회하고 싶은 값
  • aggfunc는 value를 산출하는 연산법
    (1) e.g.: aggfunc = np.sum / np.mean
    (2) 설정하지 않은 경우 기본적으로 평균값을 구한다
1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
pd.pivot_table(df, index = "소속사", columns = "혈액형", values = "키")
혈액형 A AB B O
소속사
RBW 162.1 NaN NaN NaN
YG 177.0 NaN NaN NaN
빅히트 175.8 178.0 NaN 176.60
스타크루이엔티 167.1 NaN NaN NaN
커넥트 180.0 NaN NaN NaN
판타지오 NaN NaN 183.0 NaN
플레디스 NaN 175.0 NaN 179.15
1
import numpy as np
1
pd.pivot_table(df, index = "그룹", columns = "혈액형", values  = "브랜드평판지수", aggfunc = np.sum)
혈액형 A AB B O
그룹
뉴이스트 NaN 3301654.0 NaN 8263929.0
마마무 7650928.0 NaN NaN NaN
방탄소년단 15731595.0 8073501.0 NaN 7495750.0
빅뱅 9916947.0 NaN NaN NaN
소녀시대 3918661.0 NaN NaN NaN
아스트로 NaN NaN 3506027.0 NaN
아이들 NaN NaN 4668615.0 NaN
핫샷 4036489.0 NaN NaN NaN



2. GroupBy (그룹으로 묶어 보기)

  • groupby는 데이터를 그룹으로 묶어 분석할 때 활용한다
  • 소속사별 키의 평균, 성별 키의 평균 등 특정, 그룹별 통계 및 데이터의 성질을 확인하고자 할 때 활용한다

groupby와 함께

  • count() - 갯수
  • sum() - 합계
  • mean() - 평균
  • var() - 분산
  • std() -표준편차
  • min() / max() - 최소값, 최대값
1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
1
df.groupby("소속사")
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024E760EC288>
1
df.groupby('소속사').count()
이름 그룹 성별 생년월일 혈액형 브랜드평판지수
소속사
RBW 1 1 1 1 1 1 1
SM 1 1 1 1 0 1 1
YG 1 1 1 1 1 1 1
빅히트 5 5 5 5 5 5 5
스타크루이엔티 1 1 1 1 1 1 1
커넥트 1 0 1 1 1 1 1
큐브 1 1 1 1 0 1 1
판타지오 1 1 1 1 1 1 1
플레디스 3 3 3 3 3 3 3

산술 통계는 자동으로 산술통계가 가능한 열만 출력됨.

1
df.groupby('그룹').mean()
브랜드평판지수
그룹
뉴이스트 177.766667 3.855194e+06
마마무 162.100000 7.650928e+06
방탄소년단 176.560000 6.260169e+06
빅뱅 177.000000 9.916947e+06
소녀시대 NaN 3.918661e+06
아스트로 183.000000 3.506027e+06
아이들 NaN 4.668615e+06
핫샷 167.100000 4.036489e+06
1
df.groupby('성별').sum()
브랜드평판지수
성별
남자 2123.2 68599637
여자 162.1 16238204

특정 열만 출력하고 싶다면?

1
df.groupby('혈액형')['키'].mean()
혈액형
A     172.966667
AB    176.500000
B     183.000000
O     177.875000
Name: 키, dtype: float64


3. Multi-Index (복합 인덱스)

3-1. Multi-Index 적용

행 인덱스를 복합적으로 구성하고 싶은 경우는 인덱스를 리스트로 만들어 준다

df_name .groupby([‘col_name_1’,‘col_name_2’]) .mean()

  • 데이터를 먼저 col_1기준으로 분류한 다음, col_2기준으로 한번 더 분류한다. 2번 분류 후의 데이터에 대해 산술통계값을 구한다
1
df.groupby(['혈액형', '성별']).mean()
브랜드평판지수
혈액형 성별
A 남자 175.140 7591755.20
여자 162.100 5784794.50
AB 남자 176.500 5687577.50
B 남자 183.000 3506027.00
여자 NaN 4668615.00
O 남자 177.875 3939919.75

3-2. Multi-Index 데이터 프레임을 피벗테이블로 변환

Multi-Index로 된 데이터프레임을 피벗테이블 형태로 다시 변환해줄 수 있다

df_name .unstack( ‘col_열’ )

  • col_열: groupby에서 선택한 두 column중 pivot table의 열인덱스로 지정해주고 싶은 column명을 입력
1
df2 = df.groupby(['혈액형', '성별']).mean()
1
df2
브랜드평판지수
혈액형 성별
A 남자 175.140 7591755.20
여자 162.100 5784794.50
AB 남자 176.500 5687577.50
B 남자 183.000 3506027.00
여자 NaN 4668615.00
O 남자 177.875 3939919.75
1
df2.unstack('혈액형')
브랜드평판지수
혈액형 A AB B O A AB B O
성별
남자 175.14 176.5 183.0 177.875 7591755.2 5687577.5 3506027.0 3939919.75
여자 162.10 NaN NaN NaN 5784794.5 NaN 4668615.0 NaN
1
df2.unstack('성별')
브랜드평판지수
성별 남자 여자 남자 여자
혈액형
A 175.140 162.1 7591755.20 5784794.5
AB 176.500 NaN 5687577.50 NaN
B 183.000 NaN 3506027.00 4668615.0
O 177.875 NaN 3939919.75 NaN

3-3. 인덱스 초기화 (reset_index)

reset_index() 는 Multi-Index로 구성된 데이터 프레임의 인덱스를 초기화해 준다

그 의미는 Multi-Index로 구성된 데이터 프레임 중의 index들을 dataframe의 column으로 변환시키는 것

df_name = df_name .reset_index()

1
df2
브랜드평판지수
혈액형 성별
A 남자 175.140 7591755.20
여자 162.100 5784794.50
AB 남자 176.500 5687577.50
B 남자 183.000 3506027.00
여자 NaN 4668615.00
O 남자 177.875 3939919.75
1
df2 = df2.reset_index()
1
df2
혈액형 성별 브랜드평판지수
0 A 남자 175.140 7591755.20
1 A 여자 162.100 5784794.50
2 AB 남자 176.500 5687577.50
3 B 남자 183.000 3506027.00
4 B 여자 NaN 4668615.00
5 O 남자 177.875 3939919.75