본문 바로가기

데이터분석/Python

01. Pandas 기초

01. Pandas
In [28]:
from IPython.core.display import display, HTML

display(HTML("<style> .container{width:90% !important;}</style>"))

Pandas

  • 데이터 분석을 위해 널리 사용되는 파이썬 라이브러리 패키지
  • 수치 테이블 및 시계열을 조작하기 위한 데이터 구조 및 연산을 제공
In [1]:
import pandas as pd

1. 데이터 불러오기

  • csv: pd.read_csv('')
  • excel: pd.read_excel('')

  • encoding : 'utf-8', 'cp949', 'ISO-8859-1'

In [2]:
# csv 파일 불러오기
df = pd.read_csv('./01. CCTV_in_Seoul.csv', encoding='utf-8')
# head(), tail()
df.head()
Out[2]:
기관명 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
3 강서구 884 388 258 184 81
4 관악구 1496 846 260 390 613

2. 데이터 조작

In [3]:
# Column의 이름 반환
df.columns
Out[3]:
Index(['기관명', '소계', '2013년도 이전', '2014년', '2015년', '2016년'], dtype='object')
In [4]:
# Column Rename
df.rename(columns={df.columns[0]:'구별'}, inplace=True)
df.head()
Out[4]:
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
3 강서구 884 388 258 184 81
4 관악구 1496 846 260 390 613
In [5]:
# DataFrame 값 확인
df.values
Out[5]:
array([['강남구', 2780, 1292, 430, 584, 932],
       ['강동구', 773, 379, 99, 155, 377],
       ['강북구', 748, 369, 120, 138, 204],
       ['강서구', 884, 388, 258, 184, 81],
       ['관악구', 1496, 846, 260, 390, 613],
       ['광진구', 707, 573, 78, 53, 174],
       ['구로구', 1561, 1142, 173, 246, 323],
       ['금천구', 1015, 674, 51, 269, 354],
       ['노원구', 1265, 542, 57, 451, 516],
       ['도봉구', 485, 238, 159, 42, 386],
       ['동대문구', 1294, 1070, 23, 198, 579],
       ['동작구', 1091, 544, 341, 103, 314],
       ['마포구', 574, 314, 118, 169, 379],
       ['서대문구', 962, 844, 50, 68, 292],
       ['서초구', 1930, 1406, 157, 336, 398],
       ['성동구', 1062, 730, 91, 241, 265],
       ['성북구', 1464, 1009, 78, 360, 204],
       ['송파구', 618, 529, 21, 68, 463],
       ['양천구', 2034, 1843, 142, 30, 467],
       ['영등포구', 904, 495, 214, 195, 373],
       ['용산구', 1624, 1368, 218, 112, 398],
       ['은평구', 1873, 1138, 224, 278, 468],
       ['종로구', 1002, 464, 314, 211, 630],
       ['중구', 671, 413, 190, 72, 348],
       ['중랑구', 660, 509, 121, 177, 109]], dtype=object)
In [6]:
# 컬럼 Unique
df['구별'].unique()
Out[6]:
array(['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구',
       '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구',
       '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구'], dtype=object)
In [7]:
#sort_values(): by로 지정된 컬럼 기준 정렬, ascending 옵션으로 내림차순이나 오름차순 정렬
df = df.sort_values(by='2014년', ascending=False)
df.head()
Out[7]:
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
11 동작구 1091 544 341 103 314
22 종로구 1002 464 314 211 630
4 관악구 1496 846 260 390 613
3 강서구 884 388 258 184 81
In [8]:
# 행 Slicing
df[0:3]
Out[8]:
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
11 동작구 1091 544 341 103 314
22 종로구 1002 464 314 211 630

Drop, Del

  • 컬럼 삭제
In [9]:
# 컬럼 삭제 drop or del
# axis, 1: column, 0: row
df.drop('2013년도 이전', axis=1, inplace=True)
del df['소계']
df
Out[9]:
구별 2014년 2015년 2016년
0 강남구 430 584 932
11 동작구 341 103 314
22 종로구 314 211 630
4 관악구 260 390 613
3 강서구 258 184 81
21 은평구 224 278 468
20 용산구 218 112 398
19 영등포구 214 195 373
23 중구 190 72 348
6 구로구 173 246 323
9 도봉구 159 42 386
14 서초구 157 336 398
18 양천구 142 30 467
24 중랑구 121 177 109
2 강북구 120 138 204
12 마포구 118 169 379
1 강동구 99 155 377
15 성동구 91 241 265
16 성북구 78 360 204
5 광진구 78 53 174
8 노원구 57 451 516
7 금천구 51 269 354
13 서대문구 50 68 292
10 동대문구 23 198 579
17 송파구 21 68 463

인덱스 초기화

In [10]:
df = df.reset_index()
df
Out[10]:
index 구별 2014년 2015년 2016년
0 0 강남구 430 584 932
1 11 동작구 341 103 314
2 22 종로구 314 211 630
3 4 관악구 260 390 613
4 3 강서구 258 184 81
5 21 은평구 224 278 468
6 20 용산구 218 112 398
7 19 영등포구 214 195 373
8 23 중구 190 72 348
9 6 구로구 173 246 323
10 9 도봉구 159 42 386
11 14 서초구 157 336 398
12 18 양천구 142 30 467
13 24 중랑구 121 177 109
14 2 강북구 120 138 204
15 12 마포구 118 169 379
16 1 강동구 99 155 377
17 15 성동구 91 241 265
18 16 성북구 78 360 204
19 5 광진구 78 53 174
20 8 노원구 57 451 516
21 7 금천구 51 269 354
22 13 서대문구 50 68 292
23 10 동대문구 23 198 579
24 17 송파구 21 68 463

중복제거

  • duplicated() : 중복되는 행이 있을 때, True
  • drop_duplicates() : 중복된 행들이 제거되고 unique한 행들만 얻을 수 있음
In [11]:
df.duplicated()
Out[11]:
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24    False
dtype: bool
In [12]:
df = df.drop_duplicates()
df
Out[12]:
index 구별 2014년 2015년 2016년
0 0 강남구 430 584 932
1 11 동작구 341 103 314
2 22 종로구 314 211 630
3 4 관악구 260 390 613
4 3 강서구 258 184 81
5 21 은평구 224 278 468
6 20 용산구 218 112 398
7 19 영등포구 214 195 373
8 23 중구 190 72 348
9 6 구로구 173 246 323
10 9 도봉구 159 42 386
11 14 서초구 157 336 398
12 18 양천구 142 30 467
13 24 중랑구 121 177 109
14 2 강북구 120 138 204
15 12 마포구 118 169 379
16 1 강동구 99 155 377
17 15 성동구 91 241 265
18 16 성북구 78 360 204
19 5 광진구 78 53 174
20 8 노원구 57 451 516
21 7 금천구 51 269 354
22 13 서대문구 50 68 292
23 10 동대문구 23 198 579
24 17 송파구 21 68 463

loc, iloc

In [13]:
# 특정 행 찾기
df.loc[df['2014년']==341]
Out[13]:
index 구별 2014년 2015년 2016년
1 11 동작구 341 103 314
In [14]:
# df.iloc[행, 열]
df.iloc[0:3, 0:2]
Out[14]:
index 구별
0 0 강남구
1 11 동작구
2 22 종로구

DataFrame 병합하기

In [15]:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 
                    'B': ['B0', 'B1', 'B2', 'B3']},
                   index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7']},
                   index=[4, 5, 6, 7])

Concat

  • 옵션(명시 않을시 default)
    • axis, 0: 세로로 합치기, 1: 가로로 합치기 default: 0
    • join, outer: 합집합, inner: 교집합 default: outer
    • ignore_index, False: 기존 index 유지, True: 기존 index 무시, 열 기준으로 병합
In [16]:
result = pd.concat([df1, df2], axis=0, join='outer')
result
Out[16]:
A B
0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
5 A5 B5
6 A6 B6
7 A7 B7

Merge

  • 옵션
    • on, 명시된 컬럼을 기준으로 병합
    • how: 특정 DataFrame을 기준으로 병합
      • left, right, outer, inner
In [17]:
left = pd.DataFrame({'key': ['K0', 'K4', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
In [18]:
pd.merge(left, right, how='left', on='key')
Out[18]:
key A B C D
0 K0 A0 B0 C0 D0
1 K4 A1 B1 NaN NaN
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
In [19]:
pd.merge(left, right, how='right', on='key')
Out[19]:
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A2 B2 C2 D2
2 K3 A3 B3 C3 D3
3 K1 NaN NaN C1 D1
In [21]:
# 교집합
pd.merge(left, right, how='inner', on='key')
Out[21]:
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A2 B2 C2 D2
2 K3 A3 B3 C3 D3
In [22]:
#합집합 형태로 병합, 공통된 요소가 아닌 곳은 NaN 처리
df = pd.merge(left, right, how='outer', on='key')
df
Out[22]:
key A B C D
0 K0 A0 B0 C0 D0
1 K4 A1 B1 NaN NaN
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
4 K1 NaN NaN C1 D1

NaN 데이터 처리

  • dropna : NaN 데이터가 있는 축(행, 열) 제외
  • fillna : NaN 데이터를 대신 할 값을 채움
  • isnull : NaN 값인지 True, False 반환
  • notnull : NaN이 아닌지 True, False 반환
In [23]:
df.isnull()
Out[23]:
key A B C D
0 False False False False False
1 False False False True True
2 False False False False False
3 False False False False False
4 False True True False False
In [24]:
df.notnull()
Out[24]:
key A B C D
0 True True True True True
1 True True True False False
2 True True True True True
3 True True True True True
4 True False False True True
In [25]:
df.dropna()
Out[25]:
key A B C D
0 K0 A0 B0 C0 D0
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
In [26]:
df.fillna(1)
Out[26]:
key A B C D
0 K0 A0 B0 C0 D0
1 K4 A1 B1 1 1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
4 K1 1 1 C1 D1

통계관련

  • count: Nan 값을 제외한 값의 수를 반환
  • describe: 각 열에 대한 요약 통계
  • min, max: 최소, 최대
  • argmin, argmax: 최소, 최대 값을 가진 색인 위치 반환
  • idxmin, idxmanx: 최소 최대값을 갖고 있는 색인의 값 반환
  • sum: 합
  • cumsum: 누적합
  • cummin, cummax: 누적 최소, 최대 값
  • mean: 평균
  • median: 중위 값
  • mad: 평균값에서 절대 평균편차
  • std: 표본 정규분산
  • skew: 표본 비대칭도
  • kurt: 표본 첨도
  • diff: 1차 산술차

상관관계, 공분산

  • df.corr(): 모든 변수 간 상관관계를 계산 후 반환
  • df.col1.corr(df.col2): col1과 col2의 상관관계 계산 후 반환
  • df.cov(): 모든 변수 간 공분산을 계산 후 반환
  • df.corrwith(df.col): 하나의 변수와 나무지 변수 간의 상관관계 계산
In [ ]: