(3-2) Pandas

Yongjoo Lee·2020년 12월 15일
0
post-thumbnail

pandas

pandas를 활용해서 데이터프레임을 다뤄봅시다.

  1. Pandas 시작하기
    • prerequisite : Table
    • pandas import하기
  2. Pandas로 1차원 데이터 다루기 - Series
    • Series 선언하기
    • Series vs ndarray
    • Series vs dict
    • Series에 이름 붙이기
  3. Pandas로 2차원 데이터 다루기 - dataframe
    • dataframe 선언하기
    • from csv to dataframe
    • dataframe 자료 접근하기

수업에 사용된 covid 데이터

I. pandas 시작하기

Prerequisite : Table

  • 행과 열을 이용해서 데이터를 저장하고 관리하는 자료구조(컨테이너)
  • 주로 행은 개체, 열은 속성을 나타냄

Pandas 시작하기

import pandas를 통해서 진행

import pandas as pd

II. Series

pandas로 1차원 데이터 다루기

Series?

  • 1-D(1차원) labeled array
  • 인덱스를 지정해줄 수 있음
s = pd.Series([1, 4, 9, 16, 26])

s
0     1
1     4
2     9
3    16
4    26
dtype: int64
t = pd.Series({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5})

t
one      1
two      2
three    3
four     4
five     5
dtype: int64

Series + Numpy

  • Series는 ndarray와 유사하다!
s[1]
4
t[1]
2
t[1:3]
two      2
three    3
dtype: int64
s[s > s.median()]  # 자기 자신의 median(중앙값)보다 큰 값들만 가지고 와라
3    16
4    26
dtype: int64
s[[3, 1, 4]]
3    16
1     4
4    26
dtype: int64
import numpy as np

np.exp(s)  # 지수함수
0    2.718282e+00
1    5.459815e+01
2    8.103084e+03
3    8.886111e+06
4    1.957296e+11
dtype: float64
s.dtype
dtype('int64')

Series + dict

  • Series는 dict와 유사하다!
t
one      1
two      2
three    3
four     4
five     5
dtype: int64
t['one']
1
# Series에 값 추가

t['six'] = 6

t
one      1
two      2
three    3
four     4
five     5
six      6
dtype: int64
'six' in t
True
'seven' in t
False
# t['seven'] # error!
t.get('seven')
t.get('seven', 0)
0

Series에 이름 붙이기

  • name 속성을 가지고 있다.
  • 처음 Series를 만들 때 이름을 붙일 수 있다.
s = pd.Series(np.random.randn(5), name="random_nums")  # np.random.randn은 가우시안 표준정규분포의 임의의 난수를 생성하는 함수

s
0   -1.411188
1    0.131842
2    0.444279
3    1.812722
4   -0.193795
Name: random_nums, dtype: float64
s.name = "임의의 난수"

s
0   -1.411188
1    0.131842
2    0.444279
3    1.812722
4   -0.193795
Name: 임의의 난수, dtype: float64

III. dataframe

Pandas로 2차원 데이터 다루기

dataframe?

  • 2-D(2차원) labeled table
  • 인덱스를 지정할 수도 있음
d = {"height":[1,2,3,4], "weight":[30,40,50,60]}

df = pd.DataFrame(d)

df

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F1a571ba5-74a4-4b8a-88da-617f41ba85e0%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F1a571ba5-74a4-4b8a-88da-617f41ba85e0%2Fimage.png)

## dtype 확인

df.dtypes
height    int64
weight    int64
dtype: object

From csv to dataframe

  • Comma Separated Value를 DataFrame으로 생성해줄 수 있다.
  • .read_csv()를 이용
# 동일 경로에 country_wise_latest.csv가 존재하면:

covid = pd.read_csv('./country_wise_latest.csv')

covid

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F472698b2-9487-41e9-b8ef-3a7b65b44da8%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F472698b2-9487-41e9-b8ef-3a7b65b44da8%2Fimage.png)

Pandas 활용 1. 일부분만 관찰하기

head() : 처음 n개의 데이터 참조

# 위에서부터 5개를 관찰하는 방법(함수)

covid.head()

tail(n) : 마지막 n개의 데이터를 참조

# 아래에서부터 5개를 관찰하는 방법(함수)

covid.tail(5)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fc40f5597-2d78-418a-9e62-8fdb3a6d58da%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fc40f5597-2d78-418a-9e62-8fdb3a6d58da%2Fimage.png)

Pandas 활용 2. 데이터 접근하기

  • df['column_name'] or df.column_name
  • 띄어쓰기가 있는 경우 df['column_name']을 사용해야 함!
covid['Confirmed']
0      36263
1       4880
2      27973
3        907
4        950
       ...  
182    10621
183       10
184     1691
185     4552
186     2704
Name: Confirmed, Length: 187, dtype: int64
# covid.WHO Region  #Error!

📌Honey Tip!

Dataframe의 각 column은 "Series"다!

type(covid['Confirmed'])
pandas.core.series.Series
covid['Confirmed'][0]
36263
covid['Confirmed'][1:5]
1     4880
2    27973
3      907
4      950
Name: Confirmed, dtype: int64

Pandas 활용 3. "조건"을 이용해서 데이터 접근하기

# 신규 확진자가 100명이 넘는 나라를 찾아보자!

covid[covid['New cases'] > 100]

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F153969ed-3dac-4734-bf1b-51b836e4abb1%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F153969ed-3dac-4734-bf1b-51b836e4abb1%2Fimage.png)

# WHO 지역(WHO Region)이 동남아시아인 나라 찾기

covid['WHO Region'].unique()
array(['Eastern Mediterranean', 'Europe', 'Africa', 'Americas',
       'Western Pacific', 'South-East Asia'], dtype=object)
covid[covid['WHO Region'] == 'South-East Asia']

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fb6ec73dd-85c7-41a2-9b55-c131507bcf1f%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fb6ec73dd-85c7-41a2-9b55-c131507bcf1f%2Fimage.png)

Pandas 활용 4. 행을 기준으로 데이터 접근하기

# 예시 데이터 - 도서관 정보

books_dict = {"Available":[True, True, False], "Location":[102, 215, 323], "Genre":["programming", "Physics", "Math"]}

books_df = pd.DataFrame(books_dict, index=['버그란 무엇인가', '두근두근 물리학', '미분해줘 홈즈'])
books_df

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Ffad7e383-b78d-4a68-b611-9f6520d99421%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Ffad7e383-b78d-4a68-b611-9f6520d99421%2Fimage.png)

인덱스를 이용해서 가져오기: .loc[row, col]

books_df.loc["버그란 무엇인가"]
Available           True
Location             102
Genre        programming
Name: 버그란 무엇인가, dtype: object
# "미분해줘 홈즈 책이 대출 가능한지?"

books_df.loc["미분해줘 홈즈"]["Available"] == True
False

숫자 인덱스를 이용해서 가져오기: .iloc[rowidx, colidx]

# 인덱스 0행의 인덱스 1열 가져오기

books_df.iloc[0, 1]
102
# 인덱스 1행의 인덱스 0~1열 가져오기

books_df.iloc[1, :2]
Available    True
Location      215
Name: 두근두근 물리학, dtype: object

Pandas 활용 5. groupby

  • Split : 특정한 "기준"을 바탕으로 DataFrame을 분할
  • Apply : 통계함수 - sum(), mean(), median() 등 - 을 적용해서 각 데이터를 압축
  • Combine : Apply된 결과를 바탕으로 새로운 Series를 생성 (group_key : applied_value)

.groupby()

covid.head()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F04b85763-55f3-45b6-aca1-caa703014734%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F04b85763-55f3-45b6-aca1-caa703014734%2Fimage.png)

# WHO Region 별 확진자 수

# 1. covid에서 확진자 수 column만 추출한다
# 2. 이를 covid의 WHO Region을 기준으로 groupby한다.

# Split
covid_by_region = covid['Confirmed'].groupby(by=covid['WHO Region'])

# Apply, Combine
covid_by_region.sum()
WHO Region
Africa                    723207
Americas                 8839286
Eastern Mediterranean    1490744
Europe                   3299523
South-East Asia          1835297
Western Pacific           292428
Name: Confirmed, dtype: int64
# 국가당 감염자 수

covid_by_region.mean()  # sum() / 국가 수
WHO Region
Africa                    15066.812500
Americas                 252551.028571
Eastern Mediterranean     67761.090909
Europe                    58920.053571
South-East Asia          183529.700000
Western Pacific           18276.750000
Name: Confirmed, dtype: float64

🏃‍♂️Mission:

  1. covid 데이터에서 100 case 대비 사망률(Deaths / 100 Cases)이 가장 높은 국가는?

    import pandas as pd
    covid = pd.read_csv('./country_wise_latest.csv')
    
    covid[covid['Deaths / 100 Cases'] == covid['Deaths / 100 Cases'].max()]['Country/Region'].iloc[0]
    
    'Yemen'
    
  2. covid 데이터에서 신규 확진자가 없는 나라 중 WHO Region이 'Europe'를 모두 출력하면?

    Hint : 한 줄에 동시에 두가지 조건을 Apply하는 경우 Warning이 발생할 수 있습니다.

    covid_no_new_cases = covid[covid['New cases'] == 0]
    covid_no_new_cases_europe = covid_no_new_cases[covid_no_new_cases['WHO Region'] == 'Europe']
    
    covid_no_new_cases_europe
    

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Ffb55f03f-cac5-4642-9f78-efd3a22a5314%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Ffb55f03f-cac5-4642-9f78-efd3a22a5314%2Fimage.png)

  3. 다음 데이터를 이용해 각 Region별로 아보카도가 가장 비싼 평균가격(AveragePrice)을 출력하면?

    import pandas as pd
    avocado = pd.read_csv('./avocado.csv')
    
    avocado_by_region = avocado['region'].groupby(by=avocado['AveragePrice'])
    avocado_by_region.max()
    
    AveragePrice
    0.44     CincinnatiDayton
    0.46        PhoenixTucson
    0.48              Detroit
    0.49        PhoenixTucson
    0.51        PhoenixTucson
                  ...        
    3.04    RaleighGreensboro
    3.05    MiamiFtLauderdale
    3.12         SanFrancisco
    3.17                Tampa
    3.25         SanFrancisco
    Name: region, Length: 259, dtype: object
profile
하나씩 정리하는 개발공부로그입니다.

0개의 댓글