본문 바로가기

Programming/Python

Pandas

# 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

'Programming > Python' 카테고리의 다른 글

입력값이 몇 개가 될지 모를 때(*args)  (0) 2020.09.15
영화평점 분석하기  (0) 2020.03.09
Numpy  (0) 2020.03.09
JupyterNotebook 설치  (0) 2020.03.09
함수  (0) 2020.03.09