# pandas : 엑셀과 비슷
# 자동화 할 수 있는 장점
# 다른 언어와의 접목
# 내부적으로는 numpy로 구성되어 있음
# numpy : index를 숫자로만 함
# pandas : index를 글자로 할 수 있음
# Series(1차원) : 인덱스, 값
# 넘파이의 배열과 유사
# Data Frame(2차원) : 인덱스, 밸류, 컬럼
# Dictionary : Key, Value로 구성
# pandas모듈 불러오기
# import pandas as pd
# Series 생성
population = pd.Series([9904312,3449737,2890451,2466502])
population
# 0 9904312
# 1 3449737
# 2 2890451
# 3 2466502
# dtype: int64
# 인덱스 지정하여 Series 생성
population = pd.Series([9904312,3449737,2890451,2466502], index = ['서울', '부산', '인천', '대구'])
population
# 서울 9904312
# 부산 3449737
# 인천 2890451
# 대구 2466502
# dtype: int64
# Series값 확인
# pandas는 numpy를 기반으로 하기 때문에 value들은 array
population.values
# array([9904312, 3449737, 2890451, 2466502], dtype=int64)
# Series인덱스 확인
population.index
# Index(['서울', '부산', '인천', '대구'], dtype='object')
# Series타입 확인
population.dtype
# dtype('int64')
# Series 이름 설정
population.name = '인구'
# Series 인덱스이름 설정
population.index.name = '도시'
# Series 연산
population / 1000000
# 도시
# 서울 9.904312
# 부산 3.449737
# 인천 2.890451
# 대구 2.466502
# Name: 인구, dtype: float64
# Series 인덱싱
population[1]
# 3449737
population[1], population['부산']
# (3449737, 3449737)
population[[0,3,1]]
# [] : 요소를 묶고 싶음
# [0, 3, 1]은 리스트
# 도시
# 서울 9904312
# 대구 2466502
# 부산 3449737
# Name: 인구, dtype: int64
population[['서울', '대구', '부산']]
# ['서울', '대구', '부산']은 리스트
# 도시
# 서울 9904312
# 대구 2466502
# 부산 3449737
# Name: 인구, dtype: int64
# Series Boolean 인덱싱
population >= 2500000
# 도시
# 서울 True
# 부산 True
# 인천 True
# 대구 False
# Name: 인구, dtype: bool
population[population >=2500000]
# 도시
# 서울 9904312
# 부산 3449737
# 인천 2890451
# Name: 인구, dtype: int64
population[(population >= 2500000) & (population <= 5000000)]
# 도시
# 부산 3449737
# 인천 2890451
# Name: 인구, dtype: int64
# Series 슬라이싱
population[1:3]
# 도시
# 부산 3449737
# 인천 2890451
# Name: 인구, dtype: int64
population['부산':'대구']
# 도시
# 부산 3449737
# 인천 2890451
# 대구 2466502
# Name: 인구, dtype: int64
# 딕셔너리 객체로 Series 인덱스 지정 생성
data = {"서울": 9631482, "부산": 3393191, "인천":2632035, "대전" :1490158}
population2 = pd.Series(data)
population2
# 서울 9631482
# 부산 3393191
# 인천 2632035
# 대전 1490158
# dtype: int64
population2 = pd.Series([9631482, 3393191, 2632035, 140159], index = ['서울', '부산', '인천', '대전'])
# 인구 증가계산
ds = population - population2
ds
# 대구 NaN
# 대전 NaN
# 부산 56546.0
# 서울 272830.0
# 인천 258416.0
# dtype: float64
# nan : not a number ;결측치
# Boolean값 .notnull()
ds.notnull()
# 대구 False
# 대전 False
# 부산 True
# 서울 True
# 인천 True
# dtype: bool
ds[ds.notnull()]
# 부산 56546.0
# 서울 272830.0
# 인천 258416.0
# dtype: float64
# Boolean값 .isnull()
ds.isnull()
# 대구 True
# 대전 True
# 부산 False
# 서울 False
# 인천 False
# dtype: bool
ds[ds.isnull()]
# 대구 NaN
# 대전 NaN
# dtype: float64
# 인구 증가율
rs = (population - population2) / population2 * 100
rs[rs.notnull()]
# 부산 1.666455
# 서울 2.832690
# 인천 9.818107
# dtype: float64
# Series 데이터 갱신, 추가, 삭제
rs['부산'] = 1.6
rs['대구'] = 1.41
del rs['서울']
rs[rs.notnull()]
# 대구 1.410000
# 부산 1.600000
# 인천 9.818107
# dtype: float64
# Data Frame : 딕셔너리 객체로 만든다.
data = {
"2015" : [9904312 , 3448737 , 2890451 , 2466052],
"2010" : [9631482 , 3393191 , 2632035 , 2431774]
}
df = pd.DataFrame(data)
# 2015 2010
# -----------------
# 0 51654 46844
# 1 6545641 6584684
# 2 654654 654684
# 3 654654 685468
# Data Frame 인덱스 수정
df.index = ['서울', '부산', '인천', '대구']
df
# 2015 2010
# --------------------
# 서울 51654 46844
# 부산 6545641 6584684
# 인천 654654 654684
# 대구 654654 685468
# Data Frame 인덱스, 컬럼 지정하여 생성
data = [
[51654 ,6545641, 654654 ,654654],
[46844, 6584684, 654684, 685468]
]
ind = ['2015', '2010']
col = ['서울', '부산', '인천', '대구']
df2 = pd.DataFrame(data, index = ind, columns = col)
df2
# 서울 부산 인천 대구
# --------------------------------
# 2015 51654 6545641 654654 654654
# 2010 46844 6584684 654684 685468
# .T : 행과 열 바꾸기
df2.T
# 2015 2010
# -------------------
# 서울 51654 46844
# 부산 654641 6584684
# 인천 654654 654684
# 대구 654654 684468
data = [
[175.3, 180.2, 178.6],
[66.2, 78.9, 55.1],
[27.0, 49.0, 35.0]
]
ind = ['키', '몸무게', '나이']
col = ['홍길동', '김사또', '임꺽정']
df3 = pd.DataFrame(data, index = ind, columns = col)
df3
# 홍길동 김사또 임꺽정
# ----------------------------
# 키 175.3 180.2 178.6
# 몸무게 66.2 78.9 55.1
# 나이 27.0 49.0 35.0
# Data Frame 값 확인
df3.values
# array([[175.3, 180.2, 178.6],
[ 66.2, 78.9, 55.1],
[ 27. , 49. , 35. ]])
# Data Frame 인덱스 확인
df3.index
# Index(['키', '몸무게', '나이'], dtype='object')
# Data Frame 컬럼 확인
df3.columns
# Index(['홍길동', '김사또', '임꺽정'], dtype='object')
# Data Frame 열 인덱싱
df['2015']
# 서울 51654
# 부산 6545641
# 인천 654654
# 대구 654654
# Name : 2015, dtype : int64
df[['2015']
# 2015
# ------------
# 서울 51654
# 부산 6545641
# 인천 654654
# 대구 654654
df[['2010'. '2015']]
# 2010 2015
# ---------------------
# 서울 46844 51654
# 부산 6584684 6545641
# 인천 654684 654654
# 대구 685468 654654
df['2015', '2010']]
# 2015 2010
# --------------------
# 서울 51654 46844
# 부산 6545641 6584684
# 인천 654654 654684
# 대구 654654 685468
# '2005'라는 컬럼명으로 2005년 인구수 대입
df['2005'] = [9762546 , 3512547 , 2517680 , 2456016]
# 2015 2010 2005
# -----------------------------
# 서울 51654 46844 9762546
# 부산 6545641 6584684 3512547
# 인천 654654 654684 2517680
# 대구 654654 685468 2456016
# Data Frame 행 인덱싱
df[0:1]
# 2015 2010 2005
# -------------------------
# 서울 51654 46844 84684684
df['서울':'인천']
# 2015 2010 2005
# -----------------------------
# 서울 51654 46844 9762546
# 부산 6545641 6584684 3512547
# 인천 654654 654684 2517680
# Data Frame location[] 인덱서 : 행 가져오기
# 글자 인덱싱을 함
df.loc['서울':'부산', '2015':'2010']
# 2015 2010
# --------------------
# 서울 51654 46844
# 부산 6545641 6584684
# Data Frame iloc[] 인덱서 : 행 가져오기
# 숫자 인덱싱을 함
df.iloc[3]
# 2015 2890451.0
# 2010 2632035.0
# 2005 2517680.0
# Name : 인천, dtype : float64
# Pandas Boolean 인덱싱
df['2010']>= 2500000
# 서울 False
# 부산 True
# 인천 False
# 대구 False
# Name: 2010, dtype: bool
df[df['2010']>= 2500000]
# 2015 2010 2005
# -----------------------------
# 부산 6545641 6584684 3512547
# csv 파일 불러오기
population_number = pd.read_csv('data\population_number.csv', index_col = '도시', encoding = 'euc-kr')
population_number[(population_number['2015']<=3000000) & (population_number['2005'].notnull())]
# 지역 2015 2010 2005 2000
# 도시
# -----------------------------------------------
# 대구 경상권 2466052 2431774.0 2456016.0 2473990
# 0부터 5까지 랜덤 100개 생성
s2= pd.Series(np.random.randint(6, size = 100))
s2.tail()
# 95 0
# 96 4
# 97 3
# 98 1
# 99 0
# dtype: int32
# 종류가 나온 횟수 구하기
s2.value_counts()
# 1 23
# 3 22
# 4 16
# 5 14
# 2 13
# 0 12
# dtype: int64
# 인덱스를 기준으로 정렬 : .sort_index()
# 데이터를 기준으로 정렬 : .sort_values()
# 2010년 column 데이터 기준 정렬
population_number['2010'].sort_values()
# 도시
# 대구 2431774.0
# 인천 2632035.0
# 서울 9631482.0
# 부산 NaN
# Name: 2010, dtype: float64
#내림차순
population_number['2010'].sort_values(ascending = False)
# Data Frame 2019년 데이터 기준 정렬
population_number.sort_values(by = '2010')
# 지역 2015 2010 2005 2000
# 도시
# ---------------------------------------------------------
# 대구 경상권 2466052 2431774.0 2456016.0 2473990
# 인천 수도권 2890451 2632035.0 NaN 2466338
# 서울 수도권 9904312 9631482.0 9762546.0 9853972
# 부산 경상권 3448737 NaN NaN 3655437
# 내림차순
population_number.sort_values(by = '2010', ascending = False)
# 두 개 column 기준 정렬
population_number.sort_values(by = ['지역', '2010'])
# 지역 2015 2010 2005 2000
# 도시
# ---------------------------------------------------------
# 대구 경상권 2466052 2431774.0 2456016.0 2473990
# 부산 경상권 3448737 NaN NaN 3655437
# 인천 수도권 2890451 2632035.0 NaN 2466338
# 서울 수도권 9904312 9631482.0 9762546.0 9853972
# CSV, XML, JSON
# CSV ;comma seperated vaue : , 외의 다른 탭이나 :: 등으로 구분
# XML : 태그 활용하여 데이터의 의미 부여 <몸무게> 72 </몸무게>
# 불필요한 단어가 많이 붙음
# JSON : {'시력' : 1.5, '몸무게' : 73}
# csv 파일불러오기
score = pd.read_csv('data\score.csv', index_col = '과목', encoding = 'euc-kr')
\
# 학급별 총계
score.sum()
# 1반 271
# 2반 388
# 3반 295
# 4반 243
# dtype: int64
# 학급별 순위
score.sum().sort_values(ascending = False)
# 2반 388
# 3반 295
# 1반 271
# 4반 243
# dtype: int64
# 과목별 합계 Data Frame 추가
score['합계'] = score.sum(axis = 1)
score
# 1반 2반 3반 4반 합계
# 과목
# -------------------------
# 수학 45 44 73 39 201
# 영어 76 92 45 69 282
# 국어 47 92 45 69 253
# 사회 92 81 85 40 298
# 과학 11 79 47 26 163
# 과목별 평균 Data Frame 추가
score['평균'] = score.loc['수학':'과학','1반':'4반'].mean(axis = 1)
score
# 1반 2반 3반 4반 합계 평균
# 과목
# -------------------------------
# 수학 45 44 73 39 201 50.25
# 영어 76 92 45 69 282 70.50
# 국어 47 92 45 69 253 63.25
# 사회 92 81 85 40 298 74.50
# 과학 11 79 47 26 163 40.75
# 반평균 Data Frame 추가
score.loc['반평균'] = score.loc['수학':'과학', :].mean(axis = 0)
score
# 1반 2반 3반 4반 합계 평균
# 과목
# ------------------------------------
# 수학 45.0 44.0 73.0 39.0 201.0 50.25
# 영어 76.0 92.0 45.0 69.0 282.0 70.50
# 국어 47.0 92.0 45.0 69.0 253.0 63.25
# 사회 92.0 81.0 85.0 40.0 298.0 74.50
# 과학 11.0 79.0 47.0 26.0 163.0 40.75
# 반평균 54.2 77.6 59.0 48.6 239.4 59.85
# axis : 0일 때 행추가
# 1일 때 열추가
# loc : label
# 행 기준 (axis =1) 최대, 최소값 확인
max_score = score.loc['수학':'과학', '1반':'4반'].max(axis = 1)
min_score = score.loc['수학':'과학', '1반':'4반'].min(axis = 1)
max_score - min_score
# 과목
# 수학 34.0
# 영어 47.0
# 국어 47.0
# 사회 52.0
# 과학 68.0
# dtype: float64
# 행 기준(axis = 1) 홀수 개수 확인 함수 생성
def countOdd(x):
cnt = 0
for s in x :
if s % 2 != 0 :
cnt += 1
return cnt
score.loc['수학':'과학','1반':'4반'].apply(countOdd, axis = 1)
# 과목
# 수학 3
# 영어 2
# 국어 3
# 사회 2
# 과학 3
# dtype: int64
# Dictionary로 DataFrame 생성
# .apply(pd.value_counts) : 각 값의 개수 확인
data_dic = {'A' : [1, 3, 3, 4, 4], 'B' : [1, 2, 2, 3, 3], 'C' : [1, 2, 4, 4, 5]}
df3 = pd.DataFrame(data_dic)
df4 = df3.apply(pd.value_counts)
df4
# pd.value_counts는 Series만 사용 가능
# .apply(pd.value_counts)를 활용하여 DataFrame에서 사용
# 결측치를 채워주는함수
# ffill : foward fill (바로 앞의 숫자로 채워줌), 시계열 데이터에서 많이 활용(주식)
# bfill : backward fill (바로 뒤의 숫자로 채워줌)
df4.fillna(value = 0)
#카테고리
ages = [0, 2, 10, 21, 23, 37, 31, 61, 20, 41, 32, 100]
bins = [0, 15, 25, 35, 60, 99]
labels = ['미성년자', '청년', '중년', '장년', '노년']
cats = pd.cut(ages, bins, labels=labels)
cats
# [NaN, 미성년자, 미성년자, 청년, 청년, ..., 노년, 청년, 장년, 중년, NaN]
# Length: 12
# Categories (5, object): [미성년자 < 청년 < 중년 < 장년 < 노년]
# bins : 구간 설정
# labels보다 요소 1개가 많음
# 구간에 포함 되지 않으면 NaN
# 멀티 인덱스(멀티 컬럼), keys=[] : concat함수 열인덱스에 더 큰 인덱스를 붙임
# List를 DataFrame Column으로 만들기
ageArr = pd.DataFrame(ages, column = ['ages'])
# concat 함수 : 행, 밑으로 합하기
result = pd.concat([df1, df2, df3])
result
# concat 함수 : 열, 오른쪽으로 합하기
result = pd.concat([df1, df4], axis = 1)
result
crime2015 = pd.read_csv('data/2015.csv', index_col = '관서명', encoding = 'euc-kr')
crime2016 = pd.read_csv('data/2016.csv', index_col = '관서명', encoding = 'euc-kr')
crime2017 = pd.read_csv('data/2017.csv', index_col = '관서명', encoding = 'euc-kr')
# index_col로 관서명 앞의 인덱스가 사라지고 관서명이 인덱스가 됨
# Boolean 색인
# 총계 년도
total_15 = crime2015[crime2015['구분'] == '발생건수'].sum(axis = 1)
total_16 = crime2016[crime2016['구분'] == '발생건수'].sum(axis = 1)
total_17 = crime2017[crime2017['구분'] == '발생건수'].sum(axis = 1)
# 데이터 확인
display(total_15)
display(total_16)
display(total_17)
# 광주지방경찰청 : 2017년
total_17 = total_17.drop('광주지방경찰청')
# 증감률 series생성
cr15_16 = (total_16 - total_15) / total_15 * 100
cr16_17 = (total_17 - total_16) / total_16 * 100
# series 이름 설정
total_15.name = '2015총계'
total_16.name = '2016총계'
total_17.name = '2017총계'
cr15_16.name = '2015-2016 증감률'
cr16_17.name = '2016-2017 증감률'
# series를 붙이면 자체 name이 컬럼으로 올라감
result = pd.concat([total_15, cr15_16, total_16, cr16_17, total_17], axis = 1)
result