#!/usr/bin/env python # coding: utf-8 # ### 따라 하며 배우는 데이터 과학 - 파이썬 편 2 - 데이터 취득과 가공 # # 본 장은 ["따라 하며 배우는 데이터 과학"](https://dataninja.me/ipds-kr/) 3장의 # "데이터 취득과 데이터 가공: SQL과 dplyr" 내용의 파이썬 버전입니다. # #### Data Sources: # - `data/gapminder.tsv` : https://raw.githubusercontent.com/jennybc/gapminder/master/data-raw/08_gap-every-five-years.tsv # In[1]: get_ipython().run_line_magic('matplotlib', 'inline') import pandas as pd import numpy as np # # 1. gapminder 자료 읽어들이기 # In[2]: # gapminder 자료를 다운로드하고 판다스 데이터프레임으로 읽어들이자 gapminder = pd.read_csv("data/gapminder.tsv", sep="\t") # In[3]: gapminder.head() # In[4]: gapminder.tail() # In[5]: gapminder.info() # In[6]: gapminder.describe() # # 데이터를 처리하는 핵심 동사 # # ## 1. 행을 선택하기 # In[7]: # gapminder 데이터에서 한국 데이터, 2007년 데이터, 한국 2007년 데이터를 추출하는 명령은 다음과 같다. # R dplyr 에서는 filter(gapminder, country=='Korea, Rep.' & year==2007) gapminder.query("country=='Korea, Rep.' & year==2007") # ## 2. 행(관측치)를 정렬하기 # In[8]: # gapminder 데이터를 year, country 변수순으로 정렬하려면, # R dplyr 에서는 gapminder %>% arrange(year, country) gapminder.sort_values(by=["year", "country"]).head() # ## 3. 열(변수)를 선택하기 # In[9]: # gapminder 데이터에서 pop, gdpPercap 변수만 선택. # R dplyr 에서는 gapminder %>% select(pop, gdpPercap) gapminder[["pop", "gdpPercap"]].head() # ## 4. 변수 변환하기 # In[10]: # gapminder 데이터에서 기존의 변수들을 변환한 결과를 기존 변수나 새 변수에 할당한다. # R dplyr 에서는 # gapminder %>% # mutate(total_gdp = pop * gdpPercap, # le_gdp_ratio = lifeExp / gdpPercap, lgrk = le_gdp_ratio * 100) # 1. 파이썬에서는 각 변수 할당에 새로운 assign() 함수를 사용해야 한다. # 2. x.pop 은 내부의 pop() 함수와 충돌을 일으키므로 x['pop']으로 표현했다. gapminder.\ assign(total_gdp = lambda x: (x['pop'] * x['gdpPercap'])).\ assign(le_gdp_ratio = lambda x: (x['lifeExp'] / x['gdpPercap'])).\ assign(lgrk = lambda x: x['le_gdp_ratio'] * 100).\ head() # ## 5. 요약 통계량 계산하기 # In[11]: # gapminder 데이터에서 기존의 변수들을 변환한 결과를 기존 변수나 새 변수에 할당한다. # R dplyr 에서는 # gapminder %>% summarize(n_obs = n( ), # n_countries = n_distinct(country), # n_years = n_distinct(year), # med_gdpc = median(gdpPercap), # max_gdppc = max(gdpPercap)) gapminder.aggregate(['mean', 'median']) # ## 6. 랜덤 샘플을 위한 sample() # In[12]: np.random.seed(12345) gapminder.sample(n=10) # In[13]: gapminder.sample(frac=.01).shape # ## 7. 고유한 행을 찾아내는 distinct( ) # In[14]: # R dplyr 는 # gapminder %>% select(country) %>% distinct() # gapminder %>% select(year) %>% distinct() gapminder.country.unique(), gapminder.year.unique() # In[15]: gapminder.drop_duplicates(['country', 'year']).head() # # group_by() 를 이용한 그룹 연산 # In[16]: # R dplyr 는 # gapminder %>% # filter(year == 2007) %>% # group_by(continent) %>% # summarize(median(lifeExp)) gapminder.\ query('year == 2007').\ groupby('continent').\ agg({'lifeExp':'median'}) # ## 조인 연산자; inner, left, right, full(outer) join # R dplyr 예는 다음과 같다. # ``` # (df1 <- data_frame(x = c(1, 2), y = 2:1)) # (df2 <- data_frame(x = c(1, 3), a = 10, b = "a")) # df1 %>% inner_join(df2) # df1 %>% left_join(df2) # df1 %>% right_join(df2) # df1 %>% full_join(df2) # ``` # 파이썬 판다스에서는 `DataFrame.merge` 함수로 처리하면 된다. # In[17]: df1 = pd.DataFrame(data={'x':range(2), 'y':range(2, 0, -1)}) df1 # In[18]: df2 = pd.DataFrame(data={'x':[1,3], 'a':10, 'b':"a"}) df2 # In[19]: df1.merge(df2, how="inner") # In[20]: df1.merge(df2, how="left") # In[21]: df1.merge(df2, how="inner") # In[22]: df1.merge(df2, how="right") # In[23]: df1.merge(df2, how="outer")