1 Pandas 라이브러리
1.1 Pandas Series자료구조
import pandas as pd
1.1.1 Series 생성하기
population = [9617795,3355632,2951065,1479550]
population_s = pd.Series(population,index = ['서울','부산','인천','광주'])
population_s
1.1.2 Series 속성값
#1. Series내부에 저장되어있는 값들을 확인하기
print(population_s.values)
#2. Series내부에 있는 인덱스들을 확인하기
print(population_s.index)
#3. Series의 타입 확인하기
print(population_s.dtype)
#4. Series 데이터에 이름 부여하기
population_s.name = '인구수'
#5. Series 데이터 인덱스에 이름 부여하기
population_s.index.name = '도시'
population_s
1.1.3 Serires 데이터 연산해보기
population_s / 1000000
1.1.4 Series데이터 인덱싱
population_s[0]
population_s[[1,3]]
# boolean 인덱싱
# 인구가 250만명 이상인 도시를 찾아보자!
population_s[population_s >= 2500000].index
#1. 인구수가 500만명 이상인 도시명만 출력
population_s[population_s >= 5000000].index
#2. 인구수가 250만명 이상이고 500만명 이하인 데이터만 출력
(population_s >= 2500000) & (population_s <= 5000000)
# Series 데이터 슬라이싱 하기
population_s[1:3]
# 명칭으로 가져올 때는 끝값을 포함해서 가지고 온다.
population_s['부산':'인천']
1.1.5 Dictionary 구조를 활용해서 Series 생성하기
dic_data = {'아구몬':900000,'파닥몬':500000,'파피몬': 600000, '팔몬':400000}
digimon = pd.Series(dic_data)
digimon
dic_data2 = {'아구몬':960000,'엔젤몬':700000,'가루몬':660000,'팔몬':500000}
digimon_level_up = pd.Series(dic_data2)
digimon_level_up
# 레벨업 했을 때 올라간 공격력 계산
attack = digimon_level_up - digimon
attack
# 결측치(NaN)가 없는 데이터들만 확인해보기
attack[attack.notnull()
# 결측치인 데이터들만 확인해보기
attack[attack.isnull()]
# 1. 레벨업해서 올라간 공격력의 증가율(%) 계산
# (레벨업 - 디지몬)/디지몬 * 100
rp = (digimon_level_up-digimon)/digimon*100
# 2. null값이 아닌 데이터들만 출력!
rp[rp.notnull()]
1.1.6 Series 데이터 추가, 갱신, 삭제
# 1. 데이터 갱신(변경)
rp['가루몬']=8.7777
# 2. 데이터 삭제
del rp['파피몬']
rp
# 3. 데이터 추가하기
rp['피요몬'] = 1.6
rp
1.2 DataFrame
2차원 구조
행과 열로 이루어져있는 표와 같은 형태
Series자료구조를 여러개 합친 형태
열단위로 봤을 때는 동일한 데이터 타입이 저장되어있다.
행단위로 봤을 때는 서로 다른 데이터 타입이 저장될 수 있다.
data = {'2015':[9904312,3448737,2890451,2466052],
'2010':[9631482,3393191,2632035,2431774]}
df = pd.DataFrame(data,index=['서울','부산','인천','광주'])
df
#1. DF안에 있는 값 확인
df.values
#2. DF안에 있는 인덱스 확인
df.index
#3. DF안에 있는 컬럼 확인
df.columns
#4. DF를 전치하기
df.T
# 1. df['컬럼이름'] : Series
df['2015']
# 2. df[['컬럼이름']] : DF
df[['2010','2015']]
# 3. 행 인덱싱
# df[:] : 항상 슬라이싱 형태로 넣어줘야 한다.
# 데이터가 하나만 들어있으면 무조건 열 기준으로 인덱싱을 해온다.
df[:'서울']
df[:1]
# Quiz. ,서울 ~ 인천 데이터를 가져오는데 2015년도 데이터만 가져오기
df['서울':'인천'][['2015']]
# 컬럼 추가하는 방법
# df['2005'] --> Series 인덱싱 방법 --> 원하는 데이터를 리스트 구조형태로 집어넣기
df['2005'] = [9762546,3512547,2517680,2456016]
df
# 4. loc인덱서(DF 인덱서)
# : 실제 인덱스 명칭을 가지고 DF을 인덱싱, 슬라이싱 할 때 사용한다.
# df.loc[행(인덱스 명), 열(인덱스 명)]
df.loc['서울':'부산','2015':'2010']
#5. iLoc인덱서
# : 인덱스 번호를 기준으로 인덱싱, 슬라이싱 하는 방법
# df.iloc[행(인덱스 번호),열(인덱스 번호)]
df.iloc[0:2,0:2]
# 6. boolean 인덱싱
# 인구수가 280만명 이상인 데이터들만 출력
# df형태로 boolean 인덱싱을 진행하면 False로 나오는 값들은 결측치로 처리된다.
df[df>=2800000]
# Series 형태로 boolean 인덱싱을 진행하면 False로 나오는 값들은 결과값에서 제외된다.
df[df['2010']>=3000000]
1.2.1 csv파일을 DF 형태로 가져오기
population = pd.read_csv('population_number.csv', encoding='euc-kr',
index_col = '도시')
population
1.2.2 DF의 함수들
# 1. 정렬
# 인덱스를 기준으로 정렬하는 방법
population.sort_index(ascending=False)
# 값들을 기준으로 정렬하는 방법
population.sort_values(by = ['지역','2010'])
#2. NaN 결측치 값을 채우기
# 행 단위 : 객체
# 열 단위 : 특징, 특성, 변수
population.fillna(2000000)
# score.csv 파일을 불러와 score 변수에 저장하기
score = pd.read_csv('score.csv', encoding='euc-kr', index_col='과목')
score
# axis = 0 ---> 열단위를 기준으로 함수를 수행
# axis = 1 ---> 행단위를 기준으로 함수를 수행
# Quiz. 학급별 총합계의 순위를 내림차순으로 출력
score.sum().sort_values(ascending=False)
# Quiz2. 과목별 합계를 구해서 score DataFrame에 합계열을 추가해서 해당하는 과목별 합계 데이터 추가하기
score['합계']=score.sum(axis=1)
score
# Quiz3. 과목별 평균을 구해서 평균 열을 추가
score['평균'] = score.iloc[:,:4].mean(axis = 1)
score
# df[] --> 기준을 열로 잡아서 인덱싱 해오는 방식
# df.loc[] / df.iloc[] --> 기준을 행으로 잡아서 인덱싱 해오는 방식
score.loc['반평균'] = score.mean()
score
# DataFrame --> Series 여러개로 구성이 되어있다.
# Series --> np.ndarray클래스를 값으로 가지고 있다.
# np.ndarray클래스 --> 동일한 자료형만 저장가능하다.
# 소수점으로 결과가 나왔을 때 자동으로 형변환을 진행한다.
# 전체 반에서 과목별 가장 높은 점수만 추출
max_data = score.loc[:'Web',:'4반'].max(axis = 1)
# 전체 반에서 과목별 가장 낮은 점수만 추출
min_data = score.iloc[:5,:4].min(axis = 1)
# 과목별 가장 높은 점수 - 낮은 점수 출력
max_data-min_data
# 최고점수 - 최저점수 max_min 함수 생성
def max_min(x):
# x는 DF 가정하고
return x.max() - x.min()
score.loc[:'Web',:'4반'].apply(max_min, axis=1)
1.2.3 DataFrame apply 함수
Pandas의 DataFrame에 행과 열에 내가 원하는 함수를 적용시키는 방법
df.apply(함수이름, 축에 대한 설정)
import numpy as np
score_temp = score.loc[:'Web',:'4반']
score_temp.apply(np.square)
score_temp.apply(lambda x:np.square(x) if x.name in ['1반', '2반'] else x)
1.3 카테고리 생성하기
# titanic 이라는 이름으로 train.csv 파일을 읽어오기
titanic = pd.read_csv('train.csv',index_col='PassengerId')
# df에서 위쪽에 있는 5개 데이터만 가져오는 방법
titanic_5= titanic.head()
titanic_5
titanic.tail()
# titanic Age열의 최소값
titanic['Age'].min()
# titianic Age열의 최대값
titanic['Age'].max()
# 0~80
# 미성년자, 청년, 중년
# 0~19, 20~50, 51~80
# 카테고리 생성해보기
# 데이터 --> titanic Age열
# 구간 생성(앞에 숫자 초과 뒤에 숫자 이하)
bins = [-1,19,50,80]
# 카테고리 명 생성하기
labels = ['미성년자','청년','중년']
# 카테고리 생성하는 방법
cats = pd.cut(titanic_5['Age'],bins,labels=labels)
cats
cats = pd.cut(titanic['Age'],3,labels=labels)
# 값이 몇개씩 나왔는지 자동으로 카운팅 해주는 기능
cats.value_counts()
1.3.1 DF 병합하기(하나로 합치기)
df1 = pd.DataFrame({'A':[0,1,2,3],
'B':[0,1,2,3],
'C':[0,1,2,3]})
df2 = pd.DataFrame({'A':[4,5,6,7],
'B':[4,5,6,7],
'C':[4,5,6,7]})
df1
pd.concat([df1,df2])
pd.concat([df1,df2],axis=1)
1.4 최종실습
# 전년도 대비 범죄율의 증감율을 구해보자!
# 증감률 = (금년 - 작년) / 작년 * 100
# 1. 각각의 csv 파일을 읽어오기(인덱스 명칭은 관서명으로!)
df_2015 = pd.read_csv('2015.csv',encoding='euc-kr',index_col='관서명')
df_2016 = pd.read_csv('2016.csv',encoding='euc-kr',index_col='관서명')
df_2017 = pd.read_csv('2017.csv',encoding='euc-kr',index_col='관서명')
# 2. 각각의 데이터 확인해보기
df_2017.index
# 3. 2017년도에만 존재하는 데이터 삭제하기(drop)
df_2017 = df_2017.drop('광주지방경찰청')
# 4. 각 년도별로 관서별 범죄건수에 대해서 총합 구하기
s_2015 = df_2015[df_2015['구분']=='발생건수'].sum(axis=1, numeric_only=True)
s_2016 = df_2016[df_2016['구분']=='발생건수'].sum(axis=1, numeric_only=True)
s_2017 = df_2017[df_2017['구분']=='발생건수'].sum(axis=1, numeric_only=True)
# 5. 범죄 증감율 계산하기
s_2016_rating= (s_2016-s_2015)/s_2015*100
s_2017_rating= (s_2017-s_2016)/s_2016*100
# 6. 합병하기
result_df = pd.concat([s_2015,s_2016_rating,s_2016,s_2017_rating,s_2017], axis=1)
result_df.columns=['2015총계','2015-2016증감율','2016총계','2016-2017증감율','2017총계']
result_df