기타
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) 설정하지 않은 경우 기본적으로 평균값을 구한다
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
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
| 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() - 최소값, 최대값
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
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 |
<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 |
산술 통계는 자동으로 산술통계가 가능한 열만 출력됨.
|
키 |
브랜드평판지수 |
그룹 |
|
|
뉴이스트 |
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 |
|
키 |
브랜드평판지수 |
성별 |
|
|
남자 |
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()
|
|
|
키 |
브랜드평판지수 |
혈액형 |
성별 |
|
|
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 |
|
키 |
브랜드평판지수 |
혈액형 |
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 |
|
키 |
브랜드평판지수 |
성별 |
남자 |
여자 |
남자 |
여자 |
혈액형 |
|
|
|
|
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()
|
|
키 |
브랜드평판지수 |
혈액형 |
성별 |
|
|
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 |
|
혈액형 |
성별 |
키 |
브랜드평판지수 |
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 |