10분만에 pandas 정복하기 - 대한민국 부동산 데이터 활용편
Jul 26, 2019

Data 분석을 위해서는 pandas는 당연히 기본입니다.

문법이 어렵거나 하지 않아서 코딩을 전혀 해보지 않은 사람들도 pandas를 활용하여 손쉽게 데이터 분석을 할 수 있도록 만들어 놓은 library 입니다.

pandas의 기본 문법을 pandas에서 제공하는 10 minutes to pandas 따라서 해보면서 한 번 기초적인 분석을 해보도록 하겠습니다.

더욱 자세한 API Documentation 은 이곳에 있습니다.

데이터 준비하기

활용한 데이터는 전국 신규 민간 아파트 분양가격 동향이라는 공공데이터 포탈에서 .csv로 다운로드 받은 데이터 입니다. 자료는 언제든 최신 csv로 다운로드 받으실 수 있습니다.

여기서 간혹 csv파일을 못불러오는 에러가 뜨는 경우가 있는데, csv 파일 타입을 반드시 utf-8 csv 파일 타입으로 변경을 해야 제대로 pandas에서 불러올 수 있으며, excel로 먼저 파일을 여신 후에 “다른 이름으로 저장” -> UTF-8 CSV 로 저장하시면 제대로 불러올 수 있습니다.

pandas module import

import pandas as pd
import numpy as np

csv파일을 불러오기

df = pd.read_csv('./data/house_price_2019_03.csv')

살펴보기

df.head()
지역명 규모구분 연도 분양가격(㎡)
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879
df.tail()
지역명 규모구분 연도 분양가격(㎡)
3565 제주 전체 2019 3 3424
3566 제주 전용면적 60㎡이하 2019 3 3804
3567 제주 전용면적 60㎡초과 85㎡이하 2019 3 3504
3568 제주 전용면적 85㎡초과 102㎡이하 2019 3 3226
3569 제주 전용면적 102㎡초과 2019 3 2952

열의 이름 바꾸기

df=df.rename(columns={'분양가격(㎡)':'분양가'})
df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879

data type 보기

df.dtypes
지역명     object
규모구분    object
연도       int64
월        int64
분양가     object
dtype: object
df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879
df['분양가'] = df['분양가'].convert_objects(convert_numeric=True)
df.dtypes
지역명      object
규모구분     object
연도        int64
월         int64
분양가     float64
dtype: object
df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0

numpy array로 변환하기

arr = df.to_numpy()
arr
array([['서울', '전체', 2015, 10, 5841.0],
       ['서울', '전용면적 60㎡이하', 2015, 10, 5652.0],
       ['서울', '전용면적 60㎡초과 85㎡이하', 2015, 10, 5882.0],
       ...,
       ['제주', '전용면적 60㎡초과 85㎡이하', 2019, 3, 3504.0],
       ['제주', '전용면적 85㎡초과 102㎡이하', 2019, 3, 3226.0],
       ['제주', '전용면적 102㎡초과', 2019, 3, 2952.0]], dtype=object)
len(arr)
3570
arr[0], arr[1]
(array(['서울', '전체', 2015, 10, 5841.0], dtype=object),
 array(['서울', '전용면적 60㎡이하', 2015, 10, 5652.0], dtype=object))

간단한 통계 보기

df.describe()
연도 분양가
count 3570.000000 3570.000000 3273.000000
mean 2017.000000 6.500000 3130.001833
std 1.069195 3.634017 1141.740958
min 2015.000000 1.000000 1868.000000
25% 2016.000000 3.000000 2387.000000
50% 2017.000000 6.500000 2787.000000
75% 2018.000000 10.000000 3383.000000
max 2019.000000 12.000000 8191.000000

Transposing 하기 (축 변환하기)

# 갯수를 지정하여 출력
df.head(3)
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
df.T.head()
0 1 2 3 4 5 6 7 8 9 ... 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569
지역명 서울 서울 서울 서울 서울 인천 인천 인천 인천 인천 ... 경남 경남 경남 경남 경남 제주 제주 제주 제주 제주
규모구분 전체 전용면적 60㎡이하 전용면적 60㎡초과 85㎡이하 전용면적 85㎡초과 102㎡이하 전용면적 102㎡초과 전체 전용면적 60㎡이하 전용면적 60㎡초과 85㎡이하 전용면적 85㎡초과 102㎡이하 전용면적 102㎡초과 ... 전체 전용면적 60㎡이하 전용면적 60㎡초과 85㎡이하 전용면적 85㎡초과 102㎡이하 전용면적 102㎡초과 전체 전용면적 60㎡이하 전용면적 60㎡초과 85㎡이하 전용면적 85㎡초과 102㎡이하 전용면적 102㎡초과
연도 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ... 2019 2019 2019 2019 2019 2019 2019 2019 2019 2019
10 10 10 10 10 10 10 10 10 10 ... 3 3 3 3 3 3 3 3 3 3
분양가 5841 5652 5882 5721 5879 3163 3488 3119 3545 3408 ... 2877 2776 2855 3173 4303 3424 3804 3504 3226 2952

5 rows × 3570 columns

정렬

df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0

1. Index 정렬

# 내림차순 정렬
df.sort_index(axis=0, ascending=False)[:5]
지역명 규모구분 연도 분양가
3569 제주 전용면적 102㎡초과 2019 3 2952.0
3568 제주 전용면적 85㎡초과 102㎡이하 2019 3 3226.0
3567 제주 전용면적 60㎡초과 85㎡이하 2019 3 3504.0
3566 제주 전용면적 60㎡이하 2019 3 3804.0
3565 제주 전체 2019 3 3424.0
# 오름차순 정렬
df.sort_index(axis=0, ascending=True)[:5]
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0

2. Value 정렬

# 지역명 별로 정렬
df.sort_values(by='지역명')[:5]
지역명 규모구분 연도 분양가
1831 강원 전용면적 60㎡이하 2017 7 2167.0
896 강원 전용면적 60㎡이하 2016 8 2073.0
895 강원 전체 2016 8 2098.0
215 강원 전체 2015 12 2171.0
216 강원 전용면적 60㎡이하 2015 12 2292.0
# 연도 별로 정렬
df.sort_values(by='연도')[:5]
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
162 경남 전용면적 60㎡초과 85㎡이하 2015 11 2322.0
163 경남 전용면적 85㎡초과 102㎡이하 2015 11 2980.0
164 경남 전용면적 102㎡초과 2015 11 3043.0
165 제주 전체 2015 11 2232.0

선택 (Selection)

1. Column 이름으로 선택

df['지역명'][:5]
0    서울
1    서울
2    서울
3    서울
4    서울
Name: 지역명, dtype: object
df['연도'][:5]
0    2015
1    2015
2    2015
3    2015
4    2015
Name: 연도, dtype: int64

2. Index 선택

# index 0 부터 5 미만까지 선택
# index 지정시 : 기준으로 왼쪽은 포함, : 기준으로 오른쪽은 미만
df[0:5]
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0
# 끝에 5개 출력
df[-5:]
지역명 규모구분 연도 분양가
3565 제주 전체 2019 3 3424.0
3566 제주 전용면적 60㎡이하 2019 3 3804.0
3567 제주 전용면적 60㎡초과 85㎡이하 2019 3 3504.0
3568 제주 전용면적 85㎡초과 102㎡이하 2019 3 3226.0
3569 제주 전용면적 102㎡초과 2019 3 2952.0

3. label로 선택

df.loc[:, ['지역명', '연도']][:5]
지역명 연도
0 서울 2015
1 서울 2015
2 서울 2015
3 서울 2015
4 서울 2015
# (주의) 여기서는 :를 기준으로 우측에 있는 범위인 6을 포함하여 출력
df.loc[:6,['지역명', '연도']]
지역명 연도
0 서울 2015
1 서울 2015
2 서울 2015
3 서울 2015
4 서울 2015
5 인천 2015
6 인천 2015
# 조건을 삽입 가능
df.loc[df.index > 5, ['지역명', '연도']][:10]
지역명 연도
6 인천 2015
7 인천 2015
8 인천 2015
9 인천 2015
10 경기 2015
11 경기 2015
12 경기 2015
13 경기 2015
14 경기 2015
15 부산 2015
# 지역명 column의 값이 '인천'인 행의 '지역명', '연도' 출력
df.loc[df['지역명']=='인천',['지역명', '연도']][:10]
지역명 연도
5 인천 2015
6 인천 2015
7 인천 2015
8 인천 2015
9 인천 2015
90 인천 2015
91 인천 2015
92 인천 2015
93 인천 2015
94 인천 2015

4. iloc을 활용한 인덱스 지정 선택

df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0
df.iloc[2, 1]
'전용면적 60㎡초과 85㎡이하'
# df.iloc과 동작방식은 동일하지만, 범위 지정은 불가
df.iat[2, 1]
'전용면적 60㎡초과 85㎡이하'
df.iloc[2, :]
지역명                   서울
규모구분    전용면적 60㎡초과 85㎡이하
연도                  2015
월                     10
분양가                 5882
Name: 2, dtype: object
df.iloc[:5, 1]
0                   전체
1           전용면적 60㎡이하
2     전용면적 60㎡초과 85㎡이하
3    전용면적 85㎡초과 102㎡이하
4          전용면적 102㎡초과
Name: 규모구분, dtype: object
# iloc으로 인덱스 지정시 : 기준으로 왼쪽은 포함, : 기준으로 오른쪽은 미만
df.iloc[:5, 1:3]
규모구분 연도
0 전체 2015
1 전용면적 60㎡이하 2015
2 전용면적 60㎡초과 85㎡이하 2015
3 전용면적 85㎡초과 102㎡이하 2015
4 전용면적 102㎡초과 2015

5. 범위 조건 지정 선택

df[df.index > 3565]
지역명 규모구분 연도 분양가
3566 제주 전용면적 60㎡이하 2019 3 3804.0
3567 제주 전용면적 60㎡초과 85㎡이하 2019 3 3504.0
3568 제주 전용면적 85㎡초과 102㎡이하 2019 3 3226.0
3569 제주 전용면적 102㎡초과 2019 3 2952.0

5-a. df.연도 와 df[‘연도’] 의 column 지정방식은 동일하다

df[df.연도 == 2019][:5]
지역명 규모구분 연도 분양가
3315 서울 전체 2019 1 7600.0
3316 서울 전용면적 60㎡이하 2019 1 7400.0
3317 서울 전용면적 60㎡초과 85㎡이하 2019 1 8105.0
3318 서울 전용면적 85㎡초과 102㎡이하 2019 1 6842.0
3319 서울 전용면적 102㎡초과 2019 1 7787.0
df[df['연도'] == 2019][:5]
지역명 규모구분 연도 분양가
3315 서울 전체 2019 1 7600.0
3316 서울 전용면적 60㎡이하 2019 1 7400.0
3317 서울 전용면적 60㎡초과 85㎡이하 2019 1 8105.0
3318 서울 전용면적 85㎡초과 102㎡이하 2019 1 6842.0
3319 서울 전용면적 102㎡초과 2019 1 7787.0

Copy로 복사

df.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0
copy = df.copy()
copy.head()
지역명 규모구분 연도 분양가
0 서울 전체 2015 10 5841.0
1 서울 전용면적 60㎡이하 2015 10 5652.0
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 서울 전용면적 102㎡초과 2015 10 5879.0

값 지정

# 지역명 == 서울 인 지역만 선택
df.loc[df['지역명']=='서울','지역명'][:10]
0     서울
1     서울
2     서울
3     서울
4     서울
85    서울
86    서울
87    서울
88    서울
89    서울
Name: 지역명, dtype: object
# 지역명 == 서울 인 지역을 Seoul로 변경(값을 set)
df.loc[df['지역명']=='서울','지역명'] = 'Seoul'
df.head()
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0

reindex를 통한 지정 행과 새로운 열을 추가하여 새로운 dataframe으로 생성

df1 = df.reindex(index=df.index[:7], columns=list(df.columns) + ['extra'])
df1
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 NaN
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 NaN
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 NaN
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 NaN
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 NaN
5 인천 전체 2015 10 3163.0 NaN
6 인천 전용면적 60㎡이하 2015 10 3488.0 NaN
df1.loc[:4, 'extra'] = False
df1
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False
5 인천 전체 2015 10 3163.0 NaN
6 인천 전용면적 60㎡이하 2015 10 3488.0 NaN

빈 데이터 처리

df2 = df1.copy()
df2
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False
5 인천 전체 2015 10 3163.0 NaN
6 인천 전용면적 60㎡이하 2015 10 3488.0 NaN

1. NaN 값이 있는 행을 제거

df2.dropna(how='any')
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False

1-a 하지만 원본 데이터에는 반영이 안되어 있음

df2
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False
5 인천 전체 2015 10 3163.0 NaN
6 인천 전용면적 60㎡이하 2015 10 3488.0 NaN

1-b 원본 데이터에 반영을 시키기 위해서는 inplace=True를 적용

df2.dropna(how='any', inplace=True)
# NaN 값이 있는 행이 제거됨
df2
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False

2. NaN 값이 있는 행에 값을 채움

df2 = df1.copy()
df2
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False
5 인천 전체 2015 10 3163.0 NaN
6 인천 전용면적 60㎡이하 2015 10 3488.0 NaN
df2.fillna(value=True)
지역명 규모구분 연도 분양가 extra
0 Seoul 전체 2015 10 5841.0 False
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 False
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 False
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 False
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 False
5 인천 전체 2015 10 3163.0 True
6 인천 전용면적 60㎡이하 2015 10 3488.0 True

3. NaN 값이 있는 데이터를 Boolean 값으로 출력

pd.isna(df2)
지역명 규모구분 연도 분양가 extra
0 False False False False False False
1 False False False False False False
2 False False False False False False
3 False False False False False False
4 False False False False False False
5 False False False False False True
6 False False False False False True

연산 (Operation)

df.head()
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0

열(column) 기준 평균

df.mean()
연도     2017.000000
월         6.500000
분양가    3130.001833
dtype: float64

행(row) 기준 평균

df.mean(1)[:5]
0    2622.000000
1    2559.000000
2    2635.666667
3    2582.000000
4    2634.666667
dtype: float64
df.head()
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0

행을 2칸 뒤로 밀기

df.shift(2)[:5]
지역명 규모구분 연도 분양가
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 Seoul 전체 2015.0 10.0 5841.0
3 Seoul 전용면적 60㎡이하 2015.0 10.0 5652.0
4 Seoul 전용면적 60㎡초과 85㎡이하 2015.0 10.0 5882.0

행을 2칸 당기기

df.shift(-2)[:5]
지역명 규모구분 연도 분양가
0 Seoul 전용면적 60㎡초과 85㎡이하 2015.0 10.0 5882.0
1 Seoul 전용면적 85㎡초과 102㎡이하 2015.0 10.0 5721.0
2 Seoul 전용면적 102㎡초과 2015.0 10.0 5879.0
3 인천 전체 2015.0 10.0 3163.0
4 인천 전용면적 60㎡이하 2015.0 10.0 3488.0

Broadcasting을 이용한 subtract (빼기)

df1 = df[['연도', '월']]
df1.head()
연도
0 2015 10
1 2015 10
2 2015 10
3 2015 10
4 2015 10
df1.shape
(3570, 2)
s = np.ones(df.shape[0])
s.shape
(3570,)
df1.head()
연도
0 2015 10
1 2015 10
2 2015 10
3 2015 10
4 2015 10
s
array([1., 1., 1., ..., 1., 1., 1.])
df1.sub(s, axis=0).head()
연도
0 2014.0 9.0
1 2014.0 9.0
2 2014.0 9.0
3 2014.0 9.0
4 2014.0 9.0
s = np.ones(df1.shape[1])
s
array([1., 1.])
df1.sub(s, axis=1).head()
연도
0 2014.0 9.0
1 2014.0 9.0
2 2014.0 9.0
3 2014.0 9.0
4 2014.0 9.0

Apply

np.cumsum : cumulative sum의 함수형으로 누적 합을 구하는 함수

df1.apply(np.cumsum)[:10]
연도
0 2015 10
1 4030 20
2 6045 30
3 8060 40
4 10075 50
5 12090 60
6 14105 70
7 16120 80
8 18135 90
9 20150 100

연도 column

x.max() 는 최대값인 2019년도의 2019 x.min() 은 최소값인 2015년도의 2015 2019 - 2015 = 4가 출력

월 column

x.max() 는 최대값인 12 x.min() 은 최소값인 1 12 - 1 = 11이 출력

df1.apply(lambda x: x.max() - x.min())
연도     4
월     11
dtype: int64
df1.head()
연도
0 2015 10
1 2015 10
2 2015 10
3 2015 10
4 2015 10

값들의 종류별 출력

df1['연도'].value_counts()
2017    1020
2018    1020
2016    1020
2019     255
2015     255
Name: 연도, dtype: int64

데이터 합치기 (Data Merge)

df.head()
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0
left = df[['연도', '월']]
left.head()
연도
0 2015 10
1 2015 10
2 2015 10
3 2015 10
4 2015 10
right = df[['지역명']]
right.head()
지역명
0 Seoul
1 Seoul
2 Seoul
3 Seoul
4 Seoul

1. Concat

part_1 = pd.DataFrame(np.random.randn(3, 4))
part_2 = pd.DataFrame(np.random.randn(4, 4))
part_3 = pd.DataFrame(np.random.randn(5, 4))
part_1
0 1 2 3
0 -0.528271 0.720859 -0.722125 -0.899108
1 -0.047759 -1.242737 0.365917 0.487562
2 0.704220 -1.756446 -0.115087 -0.553400
part_2
0 1 2 3
0 1.238083 -0.430535 -0.676987 0.895199
1 1.286559 0.940526 -0.511938 0.821484
2 2.192235 0.472074 -0.302693 -0.353570
3 0.762386 -0.034152 0.778173 0.017409
part_3
0 1 2 3
0 -2.012103 -0.190446 -0.316163 -1.409107
1 -1.895678 0.214685 -0.774698 -1.046805
2 1.441786 1.363821 0.234136 -0.427928
3 -1.298646 -0.715675 0.028136 0.929860
4 0.767976 1.208685 0.212538 2.206161
part = [part_1, part_2, part_3]
part
[          0         1         2         3
 0 -0.528271  0.720859 -0.722125 -0.899108
 1 -0.047759 -1.242737  0.365917  0.487562
 2  0.704220 -1.756446 -0.115087 -0.553400,
           0         1         2         3
 0  1.238083 -0.430535 -0.676987  0.895199
 1  1.286559  0.940526 -0.511938  0.821484
 2  2.192235  0.472074 -0.302693 -0.353570
 3  0.762386 -0.034152  0.778173  0.017409,
           0         1         2         3
 0 -2.012103 -0.190446 -0.316163 -1.409107
 1 -1.895678  0.214685 -0.774698 -1.046805
 2  1.441786  1.363821  0.234136 -0.427928
 3 -1.298646 -0.715675  0.028136  0.929860
 4  0.767976  1.208685  0.212538  2.206161]
pd.concat(part)
0 1 2 3
0 -0.528271 0.720859 -0.722125 -0.899108
1 -0.047759 -1.242737 0.365917 0.487562
2 0.704220 -1.756446 -0.115087 -0.553400
0 1.238083 -0.430535 -0.676987 0.895199
1 1.286559 0.940526 -0.511938 0.821484
2 2.192235 0.472074 -0.302693 -0.353570
3 0.762386 -0.034152 0.778173 0.017409
0 -2.012103 -0.190446 -0.316163 -1.409107
1 -1.895678 0.214685 -0.774698 -1.046805
2 1.441786 1.363821 0.234136 -0.427928
3 -1.298646 -0.715675 0.028136 0.929860
4 0.767976 1.208685 0.212538 2.206161

2. Join

Join을 Column(열)을 기준으로 합칠 경우에 on=’합치고자하는 열의 이름’를 자주 사용하게 되는데, 값이 고유하지 않다면, 매우 혼란스러울 수 있다

예시1: key가 고유한 경우

left = pd.DataFrame({'연도': ['2015', '2016', '2017', '2018', '2019'], '월': ['1', '2', '3', '4', '5']})
left
연도
0 2015 1
1 2016 2
2 2017 3
3 2018 4
4 2019 5
right = pd.DataFrame({'이름': ['홍길동', '김영희', '이철수', '방탄소년단', 'QUEEN'], '월': ['1', '2', '3', '4', '5']})
right
이름
0 홍길동 1
1 김영희 2
2 이철수 3
3 방탄소년단 4
4 QUEEN 5
left.shape, right.shape
((5, 2), (5, 2))

매우 깔끔하게 합쳐진 것을 볼 수 있다

pd.merge(left, right, on='월')
연도 이름
0 2015 1 홍길동
1 2016 2 김영희
2 2017 3 이철수
3 2018 4 방탄소년단
4 2019 5 QUEEN

예시2: 중복되는 key가 있을 때 합치려는 경우 (1월을 중복으로 넣어놨음)

left = pd.DataFrame({'연도': ['2015', '2016', '2017', '2018', '2019'], '월': ['1', '1', '3', '4', '5']})
left
연도
0 2015 1
1 2016 1
2 2017 3
3 2018 4
4 2019 5
right = pd.DataFrame({'이름': ['홍길동', '김영희', '이철수', '방탄소년단', 'QUEEN'], '월': ['1', '1', '3', '4', '5']})
right
이름
0 홍길동 1
1 김영희 1
2 이철수 3
3 방탄소년단 4
4 QUEEN 5

행이 2개가 더 추가로 합쳐진 모습이다.

pd.merge(left, right, on='월')
연도 이름
0 2015 1 홍길동
1 2015 1 김영희
2 2016 1 홍길동
3 2016 1 김영희
4 2017 3 이철수
5 2018 4 방탄소년단
6 2019 5 QUEEN

3. Append

test = np.arange(0, 50)
test
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
# 1d -> 2d로 변환
test = test.reshape(10, 5)
test
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34],
       [35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49]])
test_1 = test[:3]
test_1
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
test_2 = test[3:7]
test_2
array([[15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])
test_3 = test[7:10]
test_3
array([[35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49]])
df1 = pd.DataFrame(test_1)
df1
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
df2 = pd.DataFrame(test_2)
df2
0 1 2 3 4
0 15 16 17 18 19
1 20 21 22 23 24
2 25 26 27 28 29
3 30 31 32 33 34
df3 = pd.DataFrame(test_3)
df3
0 1 2 3 4
0 35 36 37 38 39
1 40 41 42 43 44
2 45 46 47 48 49
df1.append(df2)
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
0 15 16 17 18 19
1 20 21 22 23 24
2 25 26 27 28 29
3 30 31 32 33 34

index가 이상하게 출력되는 부분은 ignore_index=True로 해결할 수 있다

df1.append(df2, ignore_index=True)
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
5 25 26 27 28 29
6 30 31 32 33 34

그룹화 (Grouping)

df.head()
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0
df.shape
(3570, 5)
df.groupby(['지역명', '연도', '월'])['분양가'].agg('sum')
지역명    연도    월 
Seoul  2015  10    28975.0
             11    31977.0
             12    31392.0
       2016  1     31635.0
             2     31559.0
             3     32400.0
             4     33504.0
             5     33185.0
             6     33085.0
             7     33369.0
             8     33174.0
             9     33246.0
             10    34239.0
             11    32672.0
             12    33449.0
       2017  1     33413.0
             2     33202.0
             3     32526.0
             4     32519.0
             5     32536.0
             6     33637.0
             7     33285.0
             8     31812.0
             9     33788.0
             10    33160.0
             11        0.0
             12    33973.0
       2018  1     33772.0
             2     34315.0
             3     35647.0
                    ...   
충북     2016  10    11276.0
             11    11283.0
             12    11497.0
       2017  1     11588.0
             2     11367.0
             3     11327.0
             4     11136.0
             5     11387.0
             6     11309.0
             7     11309.0
             8     11323.0
             9     11332.0
             10    11343.0
             11        0.0
             12    11131.0
       2018  1     11131.0
             2     11435.0
             3     12212.0
             4     12961.0
             5     13028.0
             6     12552.0
             7     12506.0
             8     12506.0
             9     12494.0
             10    12494.0
             11    12425.0
             12    12425.0
       2019  1     12425.0
             2     12158.0
             3     12235.0
Name: 분양가, Length: 714, dtype: float64

분양가 column이 현재 int 타입이 아닌 object 타입으로 되어 있기 때문에 연산이 잘 이뤄지지 않음. 따라서 int 타입으로 변경

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3570 entries, 0 to 3569
Data columns (total 5 columns):
지역명     3570 non-null object
규모구분    3570 non-null object
연도      3570 non-null int64
월       3570 non-null int64
분양가     3273 non-null float64
dtypes: float64(1), int64(2), object(2)
memory usage: 139.5+ KB
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3570 entries, 0 to 3569
Data columns (total 5 columns):
지역명     3570 non-null object
규모구분    3570 non-null object
연도      3570 non-null int64
월       3570 non-null int64
분양가     3273 non-null float64
dtypes: float64(1), int64(2), object(2)
memory usage: 139.5+ KB
grouped = df.groupby(['지역명', '연도', '월']).sum()
grouped
분양가
지역명 연도
Seoul 2015 10 28975.0
11 31977.0
12 31392.0
2016 1 31635.0
2 31559.0
3 32400.0
4 33504.0
5 33185.0
6 33085.0
7 33369.0
8 33174.0
9 33246.0
10 34239.0
11 32672.0
12 33449.0
2017 1 33413.0
2 33202.0
3 32526.0
4 32519.0
5 32536.0
6 33637.0
7 33285.0
8 31812.0
9 33788.0
10 33160.0
11 0.0
12 33973.0
2018 1 33772.0
2 34315.0
3 35647.0
... ... ... ...
충북 2016 10 11276.0
11 11283.0
12 11497.0
2017 1 11588.0
2 11367.0
3 11327.0
4 11136.0
5 11387.0
6 11309.0
7 11309.0
8 11323.0
9 11332.0
10 11343.0
11 0.0
12 11131.0
2018 1 11131.0
2 11435.0
3 12212.0
4 12961.0
5 13028.0
6 12552.0
7 12506.0
8 12506.0
9 12494.0
10 12494.0
11 12425.0
12 12425.0
2019 1 12425.0
2 12158.0
3 12235.0

714 rows × 1 columns

grouped.head()
분양가
지역명 연도
Seoul 2015 10 28975.0
11 31977.0
12 31392.0
2016 1 31635.0
2 31559.0
grouped.stack()
지역명    연도    월      
Seoul  2015  10  분양가    28975.0
             11  분양가    31977.0
             12  분양가    31392.0
       2016  1   분양가    31635.0
             2   분양가    31559.0
             3   분양가    32400.0
             4   분양가    33504.0
             5   분양가    33185.0
             6   분양가    33085.0
             7   분양가    33369.0
             8   분양가    33174.0
             9   분양가    33246.0
             10  분양가    34239.0
             11  분양가    32672.0
             12  분양가    33449.0
       2017  1   분양가    33413.0
             2   분양가    33202.0
             3   분양가    32526.0
             4   분양가    32519.0
             5   분양가    32536.0
             6   분양가    33637.0
             7   분양가    33285.0
             8   분양가    31812.0
             9   분양가    33788.0
             10  분양가    33160.0
             11  분양가        0.0
             12  분양가    33973.0
       2018  1   분양가    33772.0
             2   분양가    34315.0
             3   분양가    35647.0
                         ...   
충북     2016  10  분양가    11276.0
             11  분양가    11283.0
             12  분양가    11497.0
       2017  1   분양가    11588.0
             2   분양가    11367.0
             3   분양가    11327.0
             4   분양가    11136.0
             5   분양가    11387.0
             6   분양가    11309.0
             7   분양가    11309.0
             8   분양가    11323.0
             9   분양가    11332.0
             10  분양가    11343.0
             11  분양가        0.0
             12  분양가    11131.0
       2018  1   분양가    11131.0
             2   분양가    11435.0
             3   분양가    12212.0
             4   분양가    12961.0
             5   분양가    13028.0
             6   분양가    12552.0
             7   분양가    12506.0
             8   분양가    12506.0
             9   분양가    12494.0
             10  분양가    12494.0
             11  분양가    12425.0
             12  분양가    12425.0
       2019  1   분양가    12425.0
             2   분양가    12158.0
             3   분양가    12235.0
Length: 714, dtype: float64

group이 되어 있는 DataFrame을 unstack의 ‘레벨’을 조정하여 보여줄 수 있다. 위의 grouped에서 ‘도시’ = level 1, ‘연도’ = level 2, ‘월’

df.head(10)
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0
5 인천 전체 2015 10 3163.0
6 인천 전용면적 60㎡이하 2015 10 3488.0
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0
9 인천 전용면적 102㎡초과 2015 10 3408.0

stack & unstack을 활용한 column별 데이터 그룹핑

# level0: 열을 도시별로 출력
grouped.unstack(0)
분양가
지역명 Seoul 강원 경기 경남 경북 광주 대구 대전 부산 세종 울산 인천 전남 전북 제주 충남 충북
연도
2015 10 28975.0 10897.0 16679.0 12739.0 11027.0 7112.0 13147.0 9928.0 15518.0 13207.0 14156.0 16723.0 10400.0 10864.0 9614.0 11591.0 10455.0
11 31977.0 10888.0 16494.0 12843.0 11472.0 7119.0 13358.0 9928.0 15846.0 13279.0 14212.0 16584.0 10252.0 10902.0 9614.0 11410.0 10085.0
12 31392.0 10888.0 17104.0 12869.0 11429.0 7360.0 14490.0 9928.0 15806.0 13355.0 14212.0 16584.0 10252.0 10554.0 9685.0 11953.0 10500.0
2016 1 31635.0 10894.0 17104.0 12698.0 11406.0 7546.0 14805.0 9928.0 15929.0 13355.0 14220.0 16582.0 10252.0 10534.0 9685.0 12017.0 10518.0
2 31559.0 9013.0 16831.0 12692.0 11420.0 7546.0 14759.0 9928.0 15982.0 13355.0 14220.0 16585.0 10281.0 10535.0 9685.0 12035.0 10518.0
3 32400.0 9014.0 16958.0 12839.0 11532.0 7661.0 14896.0 9928.0 15915.0 13374.0 14445.0 16577.0 10280.0 10382.0 4628.0 11440.0 10463.0
4 33504.0 8816.0 16848.0 13029.0 11526.0 14268.0 14923.0 7403.0 15886.0 13403.0 14364.0 18092.0 10275.0 10374.0 13651.0 11803.0 10430.0
5 33185.0 8669.0 17932.0 13203.0 11534.0 14284.0 14965.0 7474.0 15828.0 13403.0 14387.0 17208.0 10279.0 10400.0 13569.0 11809.0 10476.0
6 33085.0 8678.0 18269.0 13026.0 11828.0 14319.0 15266.0 7757.0 16167.0 13372.0 14330.0 16567.0 10549.0 10371.0 14122.0 12048.0 10681.0
7 33369.0 8648.0 18315.0 12969.0 11828.0 14329.0 15295.0 7757.0 16409.0 13368.0 14330.0 16517.0 10550.0 10402.0 14122.0 12048.0 10788.0
8 33174.0 8705.0 18250.0 12984.0 11798.0 14293.0 15573.0 7757.0 16594.0 13393.0 14153.0 16617.0 10546.0 10407.0 14211.0 12167.0 10881.0
9 33246.0 8690.0 17479.0 12787.0 11812.0 13853.0 15573.0 7611.0 16611.0 13428.0 14153.0 16289.0 10563.0 10410.0 16407.0 12168.0 10886.0
10 34239.0 10608.0 17852.0 12821.0 12070.0 13862.0 15573.0 16079.0 16489.0 13525.0 14681.0 16904.0 10648.0 10431.0 16407.0 12159.0 11276.0
11 32672.0 10383.0 18362.0 12699.0 12076.0 14208.0 17464.0 14944.0 16427.0 13546.0 12571.0 16937.0 10901.0 10430.0 16461.0 12488.0 11283.0
12 33449.0 10752.0 18254.0 12739.0 12141.0 14224.0 17854.0 14944.0 17100.0 13529.0 12567.0 16926.0 10996.0 10899.0 16510.0 12513.0 11497.0
2017 1 33413.0 10711.0 18260.0 12745.0 12185.0 14215.0 17917.0 14944.0 17082.0 13529.0 12567.0 16926.0 10996.0 10951.0 16490.0 12448.0 11588.0
2 33202.0 10734.0 18571.0 12922.0 12183.0 14215.0 17992.0 15106.0 17080.0 13529.0 12572.0 17011.0 11033.0 10947.0 16453.0 12451.0 11367.0
3 32526.0 10682.0 18838.0 12853.0 12215.0 14119.0 18486.0 15106.0 16971.0 13529.0 12572.0 17100.0 11021.0 11070.0 16412.0 12453.0 11327.0
4 32519.0 10682.0 18849.0 12877.0 12311.0 14392.0 18137.0 15201.0 16970.0 13696.0 13210.0 17100.0 11053.0 11192.0 18250.0 12500.0 11136.0
5 32536.0 10767.0 18200.0 12893.0 12468.0 12005.0 18137.0 15201.0 17252.0 13696.0 13210.0 17497.0 11171.0 11273.0 20348.0 12499.0 11387.0
6 33637.0 11026.0 18379.0 13223.0 12513.0 12049.0 17782.0 15201.0 17374.0 13715.0 13217.0 17415.0 10938.0 11414.0 20762.0 12417.0 11309.0
7 33285.0 11076.0 18630.0 13345.0 12512.0 12013.0 16024.0 15448.0 17479.0 13715.0 13217.0 17862.0 10939.0 11500.0 21366.0 12420.0 11309.0
8 31812.0 11401.0 18853.0 13547.0 12864.0 12031.0 15961.0 15448.0 17782.0 13722.0 13217.0 18171.0 11074.0 11509.0 21366.0 12440.0 11323.0
9 33788.0 11237.0 18872.0 14758.0 13166.0 11797.0 15190.0 15932.0 17697.0 13840.0 13217.0 18403.0 11074.0 8870.0 11752.0 12440.0 11332.0
10 33160.0 11174.0 18806.0 13387.0 12922.0 14490.0 15190.0 11240.0 18048.0 13819.0 12438.0 18216.0 11660.0 8752.0 11752.0 12569.0 11343.0
11 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
12 33973.0 11736.0 18825.0 13896.0 10165.0 11427.0 14134.0 11091.0 18943.0 12651.0 6324.0 18309.0 11923.0 11354.0 15454.0 9519.0 11131.0
2018 1 33772.0 12157.0 20740.0 13896.0 10268.0 11422.0 14236.0 11189.0 18943.0 12651.0 6324.0 18346.0 12124.0 11354.0 15557.0 9507.0 11131.0
2 34315.0 12346.0 20954.0 13905.0 10268.0 11422.0 13793.0 11334.0 18967.0 12651.0 6348.0 18426.0 11798.0 11366.0 15862.0 9507.0 11435.0
3 35647.0 12800.0 20861.0 13910.0 10174.0 11495.0 13860.0 11334.0 18782.0 12651.0 6348.0 18889.0 11982.0 11345.0 16055.0 9507.0 12212.0
4 35662.0 12260.0 20891.0 13816.0 10121.0 11004.0 16635.0 11514.0 18874.0 15615.0 6348.0 18889.0 12024.0 12641.0 16055.0 9507.0 12961.0
5 36217.0 12333.0 21368.0 13825.0 10574.0 11046.0 18482.0 11514.0 18924.0 15615.0 6348.0 18762.0 12026.0 12720.0 16055.0 9871.0 13028.0
6 35161.0 12317.0 21249.0 13831.0 10619.0 11233.0 18445.0 11514.0 19043.0 15615.0 6250.0 13592.0 12026.0 12720.0 16055.0 12623.0 12552.0
7 35595.0 12434.0 21708.0 13813.0 10702.0 11103.0 18767.0 8383.0 19496.0 15615.0 6250.0 13592.0 12029.0 12780.0 12906.0 12623.0 12506.0
8 33783.0 12577.0 22203.0 13679.0 10500.0 11103.0 18790.0 8383.0 19514.0 15717.0 6250.0 13533.0 12029.0 12737.0 12906.0 12774.0 12506.0
9 32407.0 12590.0 22170.0 14211.0 13177.0 11293.0 18901.0 14108.0 20655.0 15717.0 6250.0 13533.0 12074.0 12737.0 12906.0 12774.0 12494.0
10 36028.0 12667.0 22191.0 14471.0 13401.0 9353.0 19194.0 14067.0 20683.0 15717.0 5780.0 16773.0 12100.0 12551.0 12906.0 12774.0 12494.0
11 36199.0 12611.0 22352.0 14628.0 13492.0 9666.0 19106.0 14067.0 20213.0 15717.0 5780.0 18662.0 11930.0 12564.0 16675.0 12627.0 12425.0
12 37073.0 12349.0 22557.0 15609.0 13492.0 9773.0 19469.0 12149.0 20269.0 15327.0 0.0 18629.0 12037.0 13114.0 16910.0 12603.0 12425.0
2019 1 37734.0 12618.0 22750.0 15609.0 13322.0 9831.0 20013.0 12243.0 20269.0 15327.0 0.0 18757.0 11972.0 13114.0 16910.0 12773.0 12425.0
2 37592.0 12618.0 22879.0 15604.0 13430.0 9831.0 20022.0 12243.0 20269.0 15327.0 0.0 19151.0 12314.0 13229.0 16910.0 12994.0 12158.0
3 37761.0 12706.0 22696.0 15984.0 13536.0 9831.0 19994.0 11718.0 20394.0 15327.0 0.0 19585.0 12236.0 13358.0 16910.0 13113.0 12235.0
# level1: 열을 연도별로 출력
grouped.unstack(1)
분양가
연도 2015 2016 2017 2018 2019
지역명
Seoul 1 NaN 31635.0 33413.0 33772.0 37734.0
2 NaN 31559.0 33202.0 34315.0 37592.0
3 NaN 32400.0 32526.0 35647.0 37761.0
4 NaN 33504.0 32519.0 35662.0 NaN
5 NaN 33185.0 32536.0 36217.0 NaN
6 NaN 33085.0 33637.0 35161.0 NaN
7 NaN 33369.0 33285.0 35595.0 NaN
8 NaN 33174.0 31812.0 33783.0 NaN
9 NaN 33246.0 33788.0 32407.0 NaN
10 28975.0 34239.0 33160.0 36028.0 NaN
11 31977.0 32672.0 0.0 36199.0 NaN
12 31392.0 33449.0 33973.0 37073.0 NaN
강원 1 NaN 10894.0 10711.0 12157.0 12618.0
2 NaN 9013.0 10734.0 12346.0 12618.0
3 NaN 9014.0 10682.0 12800.0 12706.0
4 NaN 8816.0 10682.0 12260.0 NaN
5 NaN 8669.0 10767.0 12333.0 NaN
6 NaN 8678.0 11026.0 12317.0 NaN
7 NaN 8648.0 11076.0 12434.0 NaN
8 NaN 8705.0 11401.0 12577.0 NaN
9 NaN 8690.0 11237.0 12590.0 NaN
10 10897.0 10608.0 11174.0 12667.0 NaN
11 10888.0 10383.0 0.0 12611.0 NaN
12 10888.0 10752.0 11736.0 12349.0 NaN
경기 1 NaN 17104.0 18260.0 20740.0 22750.0
2 NaN 16831.0 18571.0 20954.0 22879.0
3 NaN 16958.0 18838.0 20861.0 22696.0
4 NaN 16848.0 18849.0 20891.0 NaN
5 NaN 17932.0 18200.0 21368.0 NaN
6 NaN 18269.0 18379.0 21249.0 NaN
... ... ... ... ... ... ...
제주 7 NaN 14122.0 21366.0 12906.0 NaN
8 NaN 14211.0 21366.0 12906.0 NaN
9 NaN 16407.0 11752.0 12906.0 NaN
10 9614.0 16407.0 11752.0 12906.0 NaN
11 9614.0 16461.0 0.0 16675.0 NaN
12 9685.0 16510.0 15454.0 16910.0 NaN
충남 1 NaN 12017.0 12448.0 9507.0 12773.0
2 NaN 12035.0 12451.0 9507.0 12994.0
3 NaN 11440.0 12453.0 9507.0 13113.0
4 NaN 11803.0 12500.0 9507.0 NaN
5 NaN 11809.0 12499.0 9871.0 NaN
6 NaN 12048.0 12417.0 12623.0 NaN
7 NaN 12048.0 12420.0 12623.0 NaN
8 NaN 12167.0 12440.0 12774.0 NaN
9 NaN 12168.0 12440.0 12774.0 NaN
10 11591.0 12159.0 12569.0 12774.0 NaN
11 11410.0 12488.0 0.0 12627.0 NaN
12 11953.0 12513.0 9519.0 12603.0 NaN
충북 1 NaN 10518.0 11588.0 11131.0 12425.0
2 NaN 10518.0 11367.0 11435.0 12158.0
3 NaN 10463.0 11327.0 12212.0 12235.0
4 NaN 10430.0 11136.0 12961.0 NaN
5 NaN 10476.0 11387.0 13028.0 NaN
6 NaN 10681.0 11309.0 12552.0 NaN
7 NaN 10788.0 11309.0 12506.0 NaN
8 NaN 10881.0 11323.0 12506.0 NaN
9 NaN 10886.0 11332.0 12494.0 NaN
10 10455.0 11276.0 11343.0 12494.0 NaN
11 10085.0 11283.0 0.0 12425.0 NaN
12 10500.0 11497.0 11131.0 12425.0 NaN

204 rows × 5 columns

# level2: 열을 연도별로 출력
grouped.unstack(2)
분양가
1 2 3 4 5 6 7 8 9 10 11 12
지역명 연도
Seoul 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 28975.0 31977.0 31392.0
2016 31635.0 31559.0 32400.0 33504.0 33185.0 33085.0 33369.0 33174.0 33246.0 34239.0 32672.0 33449.0
2017 33413.0 33202.0 32526.0 32519.0 32536.0 33637.0 33285.0 31812.0 33788.0 33160.0 0.0 33973.0
2018 33772.0 34315.0 35647.0 35662.0 36217.0 35161.0 35595.0 33783.0 32407.0 36028.0 36199.0 37073.0
2019 37734.0 37592.0 37761.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
강원 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10897.0 10888.0 10888.0
2016 10894.0 9013.0 9014.0 8816.0 8669.0 8678.0 8648.0 8705.0 8690.0 10608.0 10383.0 10752.0
2017 10711.0 10734.0 10682.0 10682.0 10767.0 11026.0 11076.0 11401.0 11237.0 11174.0 0.0 11736.0
2018 12157.0 12346.0 12800.0 12260.0 12333.0 12317.0 12434.0 12577.0 12590.0 12667.0 12611.0 12349.0
2019 12618.0 12618.0 12706.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경기 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 16679.0 16494.0 17104.0
2016 17104.0 16831.0 16958.0 16848.0 17932.0 18269.0 18315.0 18250.0 17479.0 17852.0 18362.0 18254.0
2017 18260.0 18571.0 18838.0 18849.0 18200.0 18379.0 18630.0 18853.0 18872.0 18806.0 0.0 18825.0
2018 20740.0 20954.0 20861.0 20891.0 21368.0 21249.0 21708.0 22203.0 22170.0 22191.0 22352.0 22557.0
2019 22750.0 22879.0 22696.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경남 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 12739.0 12843.0 12869.0
2016 12698.0 12692.0 12839.0 13029.0 13203.0 13026.0 12969.0 12984.0 12787.0 12821.0 12699.0 12739.0
2017 12745.0 12922.0 12853.0 12877.0 12893.0 13223.0 13345.0 13547.0 14758.0 13387.0 0.0 13896.0
2018 13896.0 13905.0 13910.0 13816.0 13825.0 13831.0 13813.0 13679.0 14211.0 14471.0 14628.0 15609.0
2019 15609.0 15604.0 15984.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경북 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 11027.0 11472.0 11429.0
2016 11406.0 11420.0 11532.0 11526.0 11534.0 11828.0 11828.0 11798.0 11812.0 12070.0 12076.0 12141.0
2017 12185.0 12183.0 12215.0 12311.0 12468.0 12513.0 12512.0 12864.0 13166.0 12922.0 0.0 10165.0
2018 10268.0 10268.0 10174.0 10121.0 10574.0 10619.0 10702.0 10500.0 13177.0 13401.0 13492.0 13492.0
2019 13322.0 13430.0 13536.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
광주 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 7112.0 7119.0 7360.0
2016 7546.0 7546.0 7661.0 14268.0 14284.0 14319.0 14329.0 14293.0 13853.0 13862.0 14208.0 14224.0
2017 14215.0 14215.0 14119.0 14392.0 12005.0 12049.0 12013.0 12031.0 11797.0 14490.0 0.0 11427.0
2018 11422.0 11422.0 11495.0 11004.0 11046.0 11233.0 11103.0 11103.0 11293.0 9353.0 9666.0 9773.0
2019 9831.0 9831.0 9831.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ...
인천 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 16723.0 16584.0 16584.0
2016 16582.0 16585.0 16577.0 18092.0 17208.0 16567.0 16517.0 16617.0 16289.0 16904.0 16937.0 16926.0
2017 16926.0 17011.0 17100.0 17100.0 17497.0 17415.0 17862.0 18171.0 18403.0 18216.0 0.0 18309.0
2018 18346.0 18426.0 18889.0 18889.0 18762.0 13592.0 13592.0 13533.0 13533.0 16773.0 18662.0 18629.0
2019 18757.0 19151.0 19585.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
전남 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10400.0 10252.0 10252.0
2016 10252.0 10281.0 10280.0 10275.0 10279.0 10549.0 10550.0 10546.0 10563.0 10648.0 10901.0 10996.0
2017 10996.0 11033.0 11021.0 11053.0 11171.0 10938.0 10939.0 11074.0 11074.0 11660.0 0.0 11923.0
2018 12124.0 11798.0 11982.0 12024.0 12026.0 12026.0 12029.0 12029.0 12074.0 12100.0 11930.0 12037.0
2019 11972.0 12314.0 12236.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
전북 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10864.0 10902.0 10554.0
2016 10534.0 10535.0 10382.0 10374.0 10400.0 10371.0 10402.0 10407.0 10410.0 10431.0 10430.0 10899.0
2017 10951.0 10947.0 11070.0 11192.0 11273.0 11414.0 11500.0 11509.0 8870.0 8752.0 0.0 11354.0
2018 11354.0 11366.0 11345.0 12641.0 12720.0 12720.0 12780.0 12737.0 12737.0 12551.0 12564.0 13114.0
2019 13114.0 13229.0 13358.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
제주 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 9614.0 9614.0 9685.0
2016 9685.0 9685.0 4628.0 13651.0 13569.0 14122.0 14122.0 14211.0 16407.0 16407.0 16461.0 16510.0
2017 16490.0 16453.0 16412.0 18250.0 20348.0 20762.0 21366.0 21366.0 11752.0 11752.0 0.0 15454.0
2018 15557.0 15862.0 16055.0 16055.0 16055.0 16055.0 12906.0 12906.0 12906.0 12906.0 16675.0 16910.0
2019 16910.0 16910.0 16910.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
충남 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 11591.0 11410.0 11953.0
2016 12017.0 12035.0 11440.0 11803.0 11809.0 12048.0 12048.0 12167.0 12168.0 12159.0 12488.0 12513.0
2017 12448.0 12451.0 12453.0 12500.0 12499.0 12417.0 12420.0 12440.0 12440.0 12569.0 0.0 9519.0
2018 9507.0 9507.0 9507.0 9507.0 9871.0 12623.0 12623.0 12774.0 12774.0 12774.0 12627.0 12603.0
2019 12773.0 12994.0 13113.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
충북 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10455.0 10085.0 10500.0
2016 10518.0 10518.0 10463.0 10430.0 10476.0 10681.0 10788.0 10881.0 10886.0 11276.0 11283.0 11497.0
2017 11588.0 11367.0 11327.0 11136.0 11387.0 11309.0 11309.0 11323.0 11332.0 11343.0 0.0 11131.0
2018 11131.0 11435.0 12212.0 12961.0 13028.0 12552.0 12506.0 12506.0 12494.0 12494.0 12425.0 12425.0
2019 12425.0 12158.0 12235.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN

85 rows × 12 columns

Pivot Table

Pivot Table이란?

다시 말해 피벗 테이블이란 여러 데이터 중에서 자신이 원하는 데이터만을 가지고 원하는 행과 열에 데이터를 배치하여 새로운 보고서를 만드는 기능이다.

df.head(10)
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0
5 인천 전체 2015 10 3163.0
6 인천 전용면적 60㎡이하 2015 10 3488.0
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0
9 인천 전용면적 102㎡초과 2015 10 3408.0
pd.pivot_table(df, values='분양가', index=['연도','지역명'], columns=['월'])
1 2 3 4 5 6 7 8 9 10 11 12
연도 지역명
2015 Seoul NaN NaN NaN NaN NaN NaN NaN NaN NaN 5795.000000 6395.40 6278.400000
강원 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2179.400000 2177.60 2177.600000
경기 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3335.800000 3298.80 3420.800000
경남 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2547.800000 2568.60 2573.800000
경북 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2205.400000 2294.40 2285.800000
광주 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2370.666667 2373.00 2453.333333
대구 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2629.400000 2671.60 2898.000000
대전 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2482.000000 2482.00 2482.000000
부산 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3103.600000 3169.20 3161.200000
세종 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2641.400000 2655.80 2671.000000
울산 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2831.200000 2842.40 2842.400000
인천 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3344.600000 3316.80 3316.800000
전남 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2080.000000 2050.40 2050.400000
전북 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2172.800000 2180.40 2110.800000
제주 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2403.500000 2403.50 2421.250000
충남 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2318.200000 2282.00 2390.600000
충북 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2091.000000 2017.00 2100.000000
2016 Seoul 6327.000000 6311.800000 6480.000000 6700.800000 6637.000000 6617.000000 6673.800000 6634.800000 6649.20 6847.800000 6534.40 6689.800000
강원 2178.800000 2253.250000 2253.500000 2204.000000 2167.250000 2169.500000 2162.000000 2176.250000 2172.50 2121.600000 2076.60 2150.400000
경기 3420.800000 3366.200000 3391.600000 3369.600000 3586.400000 3653.800000 3663.000000 3650.000000 3495.80 3570.400000 3672.40 3650.800000
경남 2539.600000 2538.400000 2567.800000 2605.800000 2640.600000 2605.200000 2593.800000 2596.800000 2557.40 2564.200000 2539.80 2547.800000
경북 2281.200000 2284.000000 2306.400000 2305.200000 2306.800000 2365.600000 2365.600000 2359.600000 2362.40 2414.000000 2415.20 2428.200000
광주 2515.333333 2515.333333 2553.666667 2853.600000 2856.800000 2863.800000 2865.800000 2858.600000 2770.60 2772.400000 2841.60 2844.800000
대구 2961.000000 2951.800000 2979.200000 2984.600000 2993.000000 3053.200000 3059.000000 3114.600000 3114.60 3114.600000 3492.80 3570.800000
대전 2482.000000 2482.000000 2482.000000 2467.666667 2491.333333 2585.666667 2585.666667 2585.666667 2537.00 3215.800000 2988.80 2988.800000
부산 3185.800000 3196.400000 3183.000000 3177.200000 3165.600000 3233.400000 3281.800000 3318.800000 3322.20 3297.800000 3285.40 3420.000000
세종 2671.000000 2671.000000 2674.800000 2680.600000 2680.600000 2674.400000 2673.600000 2678.600000 2685.60 2705.000000 2709.20 2705.800000
울산 2844.000000 2844.000000 2889.000000 2872.800000 2877.400000 2866.000000 2866.000000 2830.600000 2830.60 2936.200000 3142.75 3141.750000
인천 3316.400000 3317.000000 3315.400000 3618.400000 3441.600000 3313.400000 3303.400000 3323.400000 3257.80 3380.800000 3387.40 3385.200000
전남 2050.400000 2056.200000 2056.000000 2055.000000 2055.800000 2109.800000 2110.000000 2109.200000 2112.60 2129.600000 2180.20 2199.200000
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2018 경남 2779.200000 2781.000000 2782.000000 2763.200000 2765.000000 2766.200000 2762.600000 2735.800000 2842.20 2894.200000 2925.60 3121.800000
경북 2567.000000 2567.000000 2543.500000 2530.250000 2643.500000 2654.750000 2675.500000 2625.000000 2635.40 2680.200000 2698.40 2698.400000
광주 2855.500000 2855.500000 2873.750000 2751.000000 2761.500000 2808.250000 2775.750000 2775.750000 2823.25 3117.666667 3222.00 3257.666667
대구 3559.000000 3448.250000 3465.000000 3327.000000 3696.400000 3689.000000 3753.400000 3758.000000 3780.20 3838.800000 3821.20 3893.800000
대전 2797.250000 2833.500000 2833.500000 2878.500000 2878.500000 2878.500000 2794.333333 2794.333333 3527.00 3516.750000 3516.75 4049.666667
부산 3788.600000 3793.400000 3756.400000 3774.800000 3784.800000 3808.600000 3899.200000 3902.800000 4131.00 4136.600000 4042.60 4053.800000
세종 3162.750000 3162.750000 3162.750000 3123.000000 3123.000000 3123.000000 3123.000000 3143.400000 3143.40 3143.400000 3143.40 3065.400000
울산 3162.000000 3174.000000 3174.000000 3174.000000 3174.000000 3125.000000 3125.000000 3125.000000 3125.00 2890.000000 2890.00 NaN
인천 3669.200000 3685.200000 3777.800000 3777.800000 3752.400000 3398.000000 3398.000000 3383.250000 3383.25 3354.600000 3732.40 3725.800000
전남 2424.800000 2359.600000 2396.400000 2404.800000 2405.200000 2405.200000 2405.800000 2405.800000 2414.80 2420.000000 2386.00 2407.400000
전북 2270.800000 2273.200000 2269.000000 2528.200000 2544.000000 2544.000000 2556.000000 2547.400000 2547.40 2510.200000 2512.80 2622.800000
제주 3889.250000 3965.500000 4013.750000 4013.750000 4013.750000 4013.750000 3226.500000 3226.500000 3226.50 3226.500000 3335.00 3382.000000
충남 2376.750000 2376.750000 2376.750000 2376.750000 2467.750000 2524.600000 2524.600000 2554.800000 2554.80 2554.800000 2525.40 2520.600000
충북 2226.200000 2287.000000 2442.400000 2592.200000 2605.600000 2510.400000 2501.200000 2501.200000 2498.80 2498.800000 2485.00 2485.000000
2019 Seoul 7546.800000 7518.400000 7552.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
강원 2523.600000 2523.600000 2541.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경기 4550.000000 4575.800000 4539.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경남 3121.800000 3120.800000 3196.800000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
경북 2664.400000 2686.000000 2707.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
광주 3277.000000 3277.000000 3277.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
대구 4002.600000 4004.400000 3998.800000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
대전 4081.000000 4081.000000 3906.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
부산 4053.800000 4053.800000 4078.800000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
세종 3065.400000 3065.400000 3065.400000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
인천 3751.400000 3830.200000 3917.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
전남 2394.400000 2462.800000 2447.200000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
전북 2622.800000 2645.800000 2671.600000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
제주 3382.000000 3382.000000 3382.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
충남 2554.600000 2598.800000 2622.600000 NaN NaN NaN NaN NaN NaN NaN NaN NaN
충북 2485.000000 2431.600000 2447.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN

84 rows × 12 columns

Categoricals

df.head(10)
지역명 규모구분 연도 분양가
0 Seoul 전체 2015 10 5841.0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0
5 인천 전체 2015 10 3163.0
6 인천 전용면적 60㎡이하 2015 10 3488.0
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0
9 인천 전용면적 102㎡초과 2015 10 3408.0
df['분양가'].describe()
count    3273.000000
mean     3130.001833
std      1141.740958
min      1868.000000
25%      2387.000000
50%      2787.000000
75%      3383.000000
max      8191.000000
Name: 분양가, dtype: float64
df['평가'] = 0
df.head(10)
지역명 규모구분 연도 분양가 평가
0 Seoul 전체 2015 10 5841.0 0
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 0
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 0
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 0
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 0
5 인천 전체 2015 10 3163.0 0
6 인천 전용면적 60㎡이하 2015 10 3488.0 0
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0 0
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0 0
9 인천 전용면적 102㎡초과 2015 10 3408.0 0

가격대 별 평가

low: 25% = 2387 보다 싼 분양가

mid: 50% = 2387 ~ 3130

high: 75% = 3130 ~ 3383

very high: 75% ~ 100% = 3383 보다 비싼 분양가

np.select를 활용하여 조건에 맞는 값을 대입하기

conditions = [
    (df['분양가'] < 2387),
    (df['분양가'] >= 2387) & (df['분양가'] < 3130),
    (df['분양가'] >= 3130) & (df['분양가'] < 3383),
    (df['분양가'] >= 3383),
    (df['분양가'] == np.nan)
]
choices = ['저렴', '보통', '비쌈', '매우 비쌈', '-']
df['평가'] = np.select(conditions, choices, default=0)
df.head(20)
지역명 규모구분 연도 분양가 평가
0 Seoul 전체 2015 10 5841.0 매우 비쌈
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 매우 비쌈
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 매우 비쌈
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 매우 비쌈
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 매우 비쌈
5 인천 전체 2015 10 3163.0 비쌈
6 인천 전용면적 60㎡이하 2015 10 3488.0 매우 비쌈
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0 보통
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0 매우 비쌈
9 인천 전용면적 102㎡초과 2015 10 3408.0 매우 비쌈
10 경기 전체 2015 10 3138.0 비쌈
11 경기 전용면적 60㎡이하 2015 10 3126.0 보통
12 경기 전용면적 60㎡초과 85㎡이하 2015 10 3239.0 비쌈
13 경기 전용면적 85㎡초과 102㎡이하 2015 10 3496.0 매우 비쌈
14 경기 전용면적 102㎡초과 2015 10 3680.0 매우 비쌈
15 부산 전체 2015 10 3112.0 보통
16 부산 전용면적 60㎡이하 2015 10 2950.0 보통
17 부산 전용면적 60㎡초과 85㎡이하 2015 10 2999.0 보통
18 부산 전용면적 85㎡초과 102㎡이하 2015 10 2957.0 보통
19 부산 전용면적 102㎡초과 2015 10 3500.0 매우 비쌈
df.groupby(by='평가').count()
지역명 규모구분 연도 분양가
평가
0 297 297 297 297 0
매우 비쌈 819 819 819 819 819
보통 1285 1285 1285 1285 1285
비쌈 352 352 352 352 352
저렴 817 817 817 817 817
df.sort_values(by='분양가', ascending=False)[:10]
지역명 규모구분 연도 분양가 평가
3487 Seoul 전용면적 60㎡초과 85㎡이하 2019 3 8191.0 매우 비쌈
3402 Seoul 전용면적 60㎡초과 85㎡이하 2019 2 8141.0 매우 비쌈
3317 Seoul 전용면적 60㎡초과 85㎡이하 2019 1 8105.0 매우 비쌈
2638 Seoul 전용면적 85㎡초과 102㎡이하 2018 5 8098.0 매우 비쌈
513 Seoul 전용면적 85㎡초과 102㎡이하 2016 4 8096.0 매우 비쌈
3232 Seoul 전용면적 60㎡초과 85㎡이하 2018 12 7890.0 매우 비쌈
1958 Seoul 전용면적 85㎡초과 102㎡이하 2017 9 7887.0 매우 비쌈
2553 Seoul 전용면적 85㎡초과 102㎡이하 2018 4 7823.0 매우 비쌈
2468 Seoul 전용면적 85㎡초과 102㎡이하 2018 3 7823.0 매우 비쌈
3319 Seoul 전용면적 102㎡초과 2019 1 7787.0 매우 비쌈
df.dtypes
지역명      object
규모구분     object
연도        int64
월         int64
분양가     float64
평가       object
dtype: object
df['평가'] = df['평가'].astype('category')
df.dtypes
지역명       object
규모구분      object
연도         int64
월          int64
분양가      float64
평가      category
dtype: object
df.head(10)
지역명 규모구분 연도 분양가 평가
0 Seoul 전체 2015 10 5841.0 매우 비쌈
1 Seoul 전용면적 60㎡이하 2015 10 5652.0 매우 비쌈
2 Seoul 전용면적 60㎡초과 85㎡이하 2015 10 5882.0 매우 비쌈
3 Seoul 전용면적 85㎡초과 102㎡이하 2015 10 5721.0 매우 비쌈
4 Seoul 전용면적 102㎡초과 2015 10 5879.0 매우 비쌈
5 인천 전체 2015 10 3163.0 비쌈
6 인천 전용면적 60㎡이하 2015 10 3488.0 매우 비쌈
7 인천 전용면적 60㎡초과 85㎡이하 2015 10 3119.0 보통
8 인천 전용면적 85㎡초과 102㎡이하 2015 10 3545.0 매우 비쌈
9 인천 전용면적 102㎡초과 2015 10 3408.0 매우 비쌈
df['평가'].head()
0    매우 비쌈
1    매우 비쌈
2    매우 비쌈
3    매우 비쌈
4    매우 비쌈
Name: 평가, dtype: category
Categories (5, object): [0, 매우 비쌈, 보통, 비쌈, 저렴]
df['평가'].cat.categories = ['해당없음', '개비쌈', '평균', '쫌비쌈', '쌈']
df['평가'].head()
0    개비쌈
1    개비쌈
2    개비쌈
3    개비쌈
4    개비쌈
Name: 평가, dtype: category
Categories (5, object): [해당없음, 개비쌈, 평균, 쫌비쌈, 쌈]

끝!

#python #pandas #10minstopandas


관련 글 더보기

- Pandas를 활용한 결측치 보간(interpolation) 하기

- [pandas] 공공데이터(csv) 활용시 한글 깨짐 현상 해결

- pandas 를 활용한 기본적인 산술과 통계 적용 & 이해

데이터 분석, 머신러닝, 딥러닝의 대중화를 꿈 꿉니다.