{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### 따라 하며 배우는 데이터 과학 - 파이썬 편 2 - 데이터 취득과 가공\n",
"\n",
"본 장은 [\"따라 하며 배우는 데이터 과학\"](https://dataninja.me/ipds-kr/) 3장의 \n",
"\"데이터 취득과 데이터 가공: SQL과 dplyr\" 내용의 파이썬 버전입니다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Data Sources:\n",
"- `data/gapminder.tsv` : https://raw.githubusercontent.com/jennybc/gapminder/master/data-raw/08_gap-every-five-years.tsv"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. gapminder 자료 읽어들이기"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# gapminder 자료를 다운로드하고 판다스 데이터프레임으로 읽어들이자\n",
"gapminder = pd.read_csv(\"data/gapminder.tsv\", sep=\"\\t\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1952 | \n",
" 28.801 | \n",
" 8425333 | \n",
" 779.445314 | \n",
"
\n",
" \n",
" 1 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1957 | \n",
" 30.332 | \n",
" 9240934 | \n",
" 820.853030 | \n",
"
\n",
" \n",
" 2 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1962 | \n",
" 31.997 | \n",
" 10267083 | \n",
" 853.100710 | \n",
"
\n",
" \n",
" 3 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1967 | \n",
" 34.020 | \n",
" 11537966 | \n",
" 836.197138 | \n",
"
\n",
" \n",
" 4 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1972 | \n",
" 36.088 | \n",
" 13079460 | \n",
" 739.981106 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"0 Afghanistan Asia 1952 28.801 8425333 779.445314\n",
"1 Afghanistan Asia 1957 30.332 9240934 820.853030\n",
"2 Afghanistan Asia 1962 31.997 10267083 853.100710\n",
"3 Afghanistan Asia 1967 34.020 11537966 836.197138\n",
"4 Afghanistan Asia 1972 36.088 13079460 739.981106"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gapminder.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 1699 | \n",
" Zimbabwe | \n",
" Africa | \n",
" 1987 | \n",
" 62.351 | \n",
" 9216418 | \n",
" 706.157306 | \n",
"
\n",
" \n",
" 1700 | \n",
" Zimbabwe | \n",
" Africa | \n",
" 1992 | \n",
" 60.377 | \n",
" 10704340 | \n",
" 693.420786 | \n",
"
\n",
" \n",
" 1701 | \n",
" Zimbabwe | \n",
" Africa | \n",
" 1997 | \n",
" 46.809 | \n",
" 11404948 | \n",
" 792.449960 | \n",
"
\n",
" \n",
" 1702 | \n",
" Zimbabwe | \n",
" Africa | \n",
" 2002 | \n",
" 39.989 | \n",
" 11926563 | \n",
" 672.038623 | \n",
"
\n",
" \n",
" 1703 | \n",
" Zimbabwe | \n",
" Africa | \n",
" 2007 | \n",
" 43.487 | \n",
" 12311143 | \n",
" 469.709298 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"1699 Zimbabwe Africa 1987 62.351 9216418 706.157306\n",
"1700 Zimbabwe Africa 1992 60.377 10704340 693.420786\n",
"1701 Zimbabwe Africa 1997 46.809 11404948 792.449960\n",
"1702 Zimbabwe Africa 2002 39.989 11926563 672.038623\n",
"1703 Zimbabwe Africa 2007 43.487 12311143 469.709298"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gapminder.tail()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 1704 entries, 0 to 1703\n",
"Data columns (total 6 columns):\n",
"country 1704 non-null object\n",
"continent 1704 non-null object\n",
"year 1704 non-null int64\n",
"lifeExp 1704 non-null float64\n",
"pop 1704 non-null int64\n",
"gdpPercap 1704 non-null float64\n",
"dtypes: float64(2), int64(2), object(2)\n",
"memory usage: 79.9+ KB\n"
]
}
],
"source": [
"gapminder.info()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 1704.00000 | \n",
" 1704.000000 | \n",
" 1.704000e+03 | \n",
" 1704.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 1979.50000 | \n",
" 59.474439 | \n",
" 2.960121e+07 | \n",
" 7215.327081 | \n",
"
\n",
" \n",
" std | \n",
" 17.26533 | \n",
" 12.917107 | \n",
" 1.061579e+08 | \n",
" 9857.454543 | \n",
"
\n",
" \n",
" min | \n",
" 1952.00000 | \n",
" 23.599000 | \n",
" 6.001100e+04 | \n",
" 241.165877 | \n",
"
\n",
" \n",
" 25% | \n",
" 1965.75000 | \n",
" 48.198000 | \n",
" 2.793664e+06 | \n",
" 1202.060309 | \n",
"
\n",
" \n",
" 50% | \n",
" 1979.50000 | \n",
" 60.712500 | \n",
" 7.023596e+06 | \n",
" 3531.846989 | \n",
"
\n",
" \n",
" 75% | \n",
" 1993.25000 | \n",
" 70.845500 | \n",
" 1.958522e+07 | \n",
" 9325.462346 | \n",
"
\n",
" \n",
" max | \n",
" 2007.00000 | \n",
" 82.603000 | \n",
" 1.318683e+09 | \n",
" 113523.132900 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" year lifeExp pop gdpPercap\n",
"count 1704.00000 1704.000000 1.704000e+03 1704.000000\n",
"mean 1979.50000 59.474439 2.960121e+07 7215.327081\n",
"std 17.26533 12.917107 1.061579e+08 9857.454543\n",
"min 1952.00000 23.599000 6.001100e+04 241.165877\n",
"25% 1965.75000 48.198000 2.793664e+06 1202.060309\n",
"50% 1979.50000 60.712500 7.023596e+06 3531.846989\n",
"75% 1993.25000 70.845500 1.958522e+07 9325.462346\n",
"max 2007.00000 82.603000 1.318683e+09 113523.132900"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gapminder.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 데이터를 처리하는 핵심 동사\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 행을 선택하기"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 851 | \n",
" Korea, Rep. | \n",
" Asia | \n",
" 2007 | \n",
" 78.623 | \n",
" 49044790 | \n",
" 23348.13973 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"851 Korea, Rep. Asia 2007 78.623 49044790 23348.13973"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# gapminder 데이터에서 한국 데이터, 2007년 데이터, 한국 2007년 데이터를 추출하는 명령은 다음과 같다.\n",
"# R dplyr 에서는 filter(gapminder, country=='Korea, Rep.' & year==2007)\n",
"gapminder.query(\"country=='Korea, Rep.' & year==2007\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. 행(관측치)를 정렬하기"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1952 | \n",
" 28.801 | \n",
" 8425333 | \n",
" 779.445314 | \n",
"
\n",
" \n",
" 12 | \n",
" Albania | \n",
" Europe | \n",
" 1952 | \n",
" 55.230 | \n",
" 1282697 | \n",
" 1601.056136 | \n",
"
\n",
" \n",
" 24 | \n",
" Algeria | \n",
" Africa | \n",
" 1952 | \n",
" 43.077 | \n",
" 9279525 | \n",
" 2449.008185 | \n",
"
\n",
" \n",
" 36 | \n",
" Angola | \n",
" Africa | \n",
" 1952 | \n",
" 30.015 | \n",
" 4232095 | \n",
" 3520.610273 | \n",
"
\n",
" \n",
" 48 | \n",
" Argentina | \n",
" Americas | \n",
" 1952 | \n",
" 62.485 | \n",
" 17876956 | \n",
" 5911.315053 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"0 Afghanistan Asia 1952 28.801 8425333 779.445314\n",
"12 Albania Europe 1952 55.230 1282697 1601.056136\n",
"24 Algeria Africa 1952 43.077 9279525 2449.008185\n",
"36 Angola Africa 1952 30.015 4232095 3520.610273\n",
"48 Argentina Americas 1952 62.485 17876956 5911.315053"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# gapminder 데이터를 year, country 변수순으로 정렬하려면,\n",
"# R dplyr 에서는 gapminder %>% arrange(year, country)\n",
"gapminder.sort_values(by=[\"year\", \"country\"]).head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. 열(변수)를 선택하기"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 8425333 | \n",
" 779.445314 | \n",
"
\n",
" \n",
" 1 | \n",
" 9240934 | \n",
" 820.853030 | \n",
"
\n",
" \n",
" 2 | \n",
" 10267083 | \n",
" 853.100710 | \n",
"
\n",
" \n",
" 3 | \n",
" 11537966 | \n",
" 836.197138 | \n",
"
\n",
" \n",
" 4 | \n",
" 13079460 | \n",
" 739.981106 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" pop gdpPercap\n",
"0 8425333 779.445314\n",
"1 9240934 820.853030\n",
"2 10267083 853.100710\n",
"3 11537966 836.197138\n",
"4 13079460 739.981106"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# gapminder 데이터에서 pop, gdpPercap 변수만 선택.\n",
"# R dplyr 에서는 gapminder %>% select(pop, gdpPercap)\n",
"gapminder[[\"pop\", \"gdpPercap\"]].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 변수 변환하기"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
" total_gdp | \n",
" le_gdp_ratio | \n",
" lgrk | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1952 | \n",
" 28.801 | \n",
" 8425333 | \n",
" 779.445314 | \n",
" 6.567086e+09 | \n",
" 0.036951 | \n",
" 3.695064 | \n",
"
\n",
" \n",
" 1 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1957 | \n",
" 30.332 | \n",
" 9240934 | \n",
" 820.853030 | \n",
" 7.585449e+09 | \n",
" 0.036952 | \n",
" 3.695180 | \n",
"
\n",
" \n",
" 2 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1962 | \n",
" 31.997 | \n",
" 10267083 | \n",
" 853.100710 | \n",
" 8.758856e+09 | \n",
" 0.037507 | \n",
" 3.750671 | \n",
"
\n",
" \n",
" 3 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1967 | \n",
" 34.020 | \n",
" 11537966 | \n",
" 836.197138 | \n",
" 9.648014e+09 | \n",
" 0.040684 | \n",
" 4.068419 | \n",
"
\n",
" \n",
" 4 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1972 | \n",
" 36.088 | \n",
" 13079460 | \n",
" 739.981106 | \n",
" 9.678553e+09 | \n",
" 0.048769 | \n",
" 4.876881 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap total_gdp \\\n",
"0 Afghanistan Asia 1952 28.801 8425333 779.445314 6.567086e+09 \n",
"1 Afghanistan Asia 1957 30.332 9240934 820.853030 7.585449e+09 \n",
"2 Afghanistan Asia 1962 31.997 10267083 853.100710 8.758856e+09 \n",
"3 Afghanistan Asia 1967 34.020 11537966 836.197138 9.648014e+09 \n",
"4 Afghanistan Asia 1972 36.088 13079460 739.981106 9.678553e+09 \n",
"\n",
" le_gdp_ratio lgrk \n",
"0 0.036951 3.695064 \n",
"1 0.036952 3.695180 \n",
"2 0.037507 3.750671 \n",
"3 0.040684 4.068419 \n",
"4 0.048769 4.876881 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# gapminder 데이터에서 기존의 변수들을 변환한 결과를 기존 변수나 새 변수에 할당한다. \n",
"# R dplyr 에서는 \n",
"# gapminder %>%\n",
"# mutate(total_gdp = pop * gdpPercap,\n",
"# le_gdp_ratio = lifeExp / gdpPercap, lgrk = le_gdp_ratio * 100)\n",
"# 1. 파이썬에서는 각 변수 할당에 새로운 assign() 함수를 사용해야 한다.\n",
"# 2. x.pop 은 내부의 pop() 함수와 충돌을 일으키므로 x['pop']으로 표현했다.\n",
"gapminder.\\\n",
" assign(total_gdp = lambda x: (x['pop'] * x['gdpPercap'])).\\\n",
" assign(le_gdp_ratio = lambda x: (x['lifeExp'] / x['gdpPercap'])).\\\n",
" assign(lgrk = lambda x: x['le_gdp_ratio'] * 100).\\\n",
" head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. 요약 통계량 계산하기"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" mean | \n",
" 1979.5 | \n",
" 59.474439 | \n",
" 2.960121e+07 | \n",
" 7215.327081 | \n",
"
\n",
" \n",
" median | \n",
" 1979.5 | \n",
" 60.712500 | \n",
" 7.023596e+06 | \n",
" 3531.846989 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" year lifeExp pop gdpPercap\n",
"mean 1979.5 59.474439 2.960121e+07 7215.327081\n",
"median 1979.5 60.712500 7.023596e+06 3531.846989"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# gapminder 데이터에서 기존의 변수들을 변환한 결과를 기존 변수나 새 변수에 할당한다. \n",
"# R dplyr 에서는 \n",
"# gapminder %>% summarize(n_obs = n( ),\n",
"# n_countries = n_distinct(country),\n",
"# n_years = n_distinct(year),\n",
"# med_gdpc = median(gdpPercap),\n",
"# max_gdppc = max(gdpPercap))\n",
"gapminder.aggregate(['mean', 'median'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. 랜덤 샘플을 위한 sample()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 1522 | \n",
" Tanzania | \n",
" Africa | \n",
" 2002 | \n",
" 49.651 | \n",
" 34593779 | \n",
" 899.074211 | \n",
"
\n",
" \n",
" 1553 | \n",
" Trinidad and Tobago | \n",
" Americas | \n",
" 1977 | \n",
" 68.300 | \n",
" 1039009 | \n",
" 7899.554209 | \n",
"
\n",
" \n",
" 238 | \n",
" Cameroon | \n",
" Africa | \n",
" 2002 | \n",
" 49.856 | \n",
" 15929988 | \n",
" 1934.011449 | \n",
"
\n",
" \n",
" 1085 | \n",
" Netherlands | \n",
" Europe | \n",
" 1977 | \n",
" 75.240 | \n",
" 13852989 | \n",
" 21209.059200 | \n",
"
\n",
" \n",
" 634 | \n",
" Guinea-Bissau | \n",
" Africa | \n",
" 2002 | \n",
" 45.504 | \n",
" 1332459 | \n",
" 575.704718 | \n",
"
\n",
" \n",
" 1569 | \n",
" Tunisia | \n",
" Africa | \n",
" 1997 | \n",
" 71.973 | \n",
" 9231669 | \n",
" 4876.798614 | \n",
"
\n",
" \n",
" 648 | \n",
" Honduras | \n",
" Americas | \n",
" 1952 | \n",
" 41.912 | \n",
" 1517453 | \n",
" 2194.926204 | \n",
"
\n",
" \n",
" 1072 | \n",
" Nepal | \n",
" Asia | \n",
" 1972 | \n",
" 43.971 | \n",
" 12412593 | \n",
" 674.788130 | \n",
"
\n",
" \n",
" 1617 | \n",
" United States | \n",
" Americas | \n",
" 1997 | \n",
" 76.810 | \n",
" 272911760 | \n",
" 35767.433030 | \n",
"
\n",
" \n",
" 953 | \n",
" Mali | \n",
" Africa | \n",
" 1977 | \n",
" 41.714 | \n",
" 6491649 | \n",
" 686.395269 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"1522 Tanzania Africa 2002 49.651 34593779 899.074211\n",
"1553 Trinidad and Tobago Americas 1977 68.300 1039009 7899.554209\n",
"238 Cameroon Africa 2002 49.856 15929988 1934.011449\n",
"1085 Netherlands Europe 1977 75.240 13852989 21209.059200\n",
"634 Guinea-Bissau Africa 2002 45.504 1332459 575.704718\n",
"1569 Tunisia Africa 1997 71.973 9231669 4876.798614\n",
"648 Honduras Americas 1952 41.912 1517453 2194.926204\n",
"1072 Nepal Asia 1972 43.971 12412593 674.788130\n",
"1617 United States Americas 1997 76.810 272911760 35767.433030\n",
"953 Mali Africa 1977 41.714 6491649 686.395269"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.random.seed(12345)\n",
"gapminder.sample(n=10)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(17, 6)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gapminder.sample(frac=.01).shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 7. 고유한 행을 찾아내는 distinct( )"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array(['Afghanistan', 'Albania', 'Algeria', 'Angola', 'Argentina',\n",
" 'Australia', 'Austria', 'Bahrain', 'Bangladesh', 'Belgium', 'Benin',\n",
" 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Brazil',\n",
" 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon',\n",
" 'Canada', 'Central African Republic', 'Chad', 'Chile', 'China',\n",
" 'Colombia', 'Comoros', 'Congo, Dem. Rep.', 'Congo, Rep.',\n",
" 'Costa Rica', \"Cote d'Ivoire\", 'Croatia', 'Cuba', 'Czech Republic',\n",
" 'Denmark', 'Djibouti', 'Dominican Republic', 'Ecuador', 'Egypt',\n",
" 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Ethiopia',\n",
" 'Finland', 'France', 'Gabon', 'Gambia', 'Germany', 'Ghana',\n",
" 'Greece', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Haiti',\n",
" 'Honduras', 'Hong Kong, China', 'Hungary', 'Iceland', 'India',\n",
" 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Israel', 'Italy',\n",
" 'Jamaica', 'Japan', 'Jordan', 'Kenya', 'Korea, Dem. Rep.',\n",
" 'Korea, Rep.', 'Kuwait', 'Lebanon', 'Lesotho', 'Liberia', 'Libya',\n",
" 'Madagascar', 'Malawi', 'Malaysia', 'Mali', 'Mauritania',\n",
" 'Mauritius', 'Mexico', 'Mongolia', 'Montenegro', 'Morocco',\n",
" 'Mozambique', 'Myanmar', 'Namibia', 'Nepal', 'Netherlands',\n",
" 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Norway', 'Oman',\n",
" 'Pakistan', 'Panama', 'Paraguay', 'Peru', 'Philippines', 'Poland',\n",
" 'Portugal', 'Puerto Rico', 'Reunion', 'Romania', 'Rwanda',\n",
" 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia',\n",
" 'Sierra Leone', 'Singapore', 'Slovak Republic', 'Slovenia',\n",
" 'Somalia', 'South Africa', 'Spain', 'Sri Lanka', 'Sudan',\n",
" 'Swaziland', 'Sweden', 'Switzerland', 'Syria', 'Taiwan', 'Tanzania',\n",
" 'Thailand', 'Togo', 'Trinidad and Tobago', 'Tunisia', 'Turkey',\n",
" 'Uganda', 'United Kingdom', 'United States', 'Uruguay', 'Venezuela',\n",
" 'Vietnam', 'West Bank and Gaza', 'Yemen, Rep.', 'Zambia', 'Zimbabwe'], dtype=object),\n",
" array([1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, 2002,\n",
" 2007]))"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# R dplyr 는\n",
"# gapminder %>% select(country) %>% distinct()\n",
"# gapminder %>% select(year) %>% distinct()\n",
"\n",
"gapminder.country.unique(), gapminder.year.unique()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" country | \n",
" continent | \n",
" year | \n",
" lifeExp | \n",
" pop | \n",
" gdpPercap | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1952 | \n",
" 28.801 | \n",
" 8425333 | \n",
" 779.445314 | \n",
"
\n",
" \n",
" 1 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1957 | \n",
" 30.332 | \n",
" 9240934 | \n",
" 820.853030 | \n",
"
\n",
" \n",
" 2 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1962 | \n",
" 31.997 | \n",
" 10267083 | \n",
" 853.100710 | \n",
"
\n",
" \n",
" 3 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1967 | \n",
" 34.020 | \n",
" 11537966 | \n",
" 836.197138 | \n",
"
\n",
" \n",
" 4 | \n",
" Afghanistan | \n",
" Asia | \n",
" 1972 | \n",
" 36.088 | \n",
" 13079460 | \n",
" 739.981106 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country continent year lifeExp pop gdpPercap\n",
"0 Afghanistan Asia 1952 28.801 8425333 779.445314\n",
"1 Afghanistan Asia 1957 30.332 9240934 820.853030\n",
"2 Afghanistan Asia 1962 31.997 10267083 853.100710\n",
"3 Afghanistan Asia 1967 34.020 11537966 836.197138\n",
"4 Afghanistan Asia 1972 36.088 13079460 739.981106"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gapminder.drop_duplicates(['country', 'year']).head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# group_by() 를 이용한 그룹 연산"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" lifeExp | \n",
"
\n",
" \n",
" continent | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Africa | \n",
" 52.9265 | \n",
"
\n",
" \n",
" Americas | \n",
" 72.8990 | \n",
"
\n",
" \n",
" Asia | \n",
" 72.3960 | \n",
"
\n",
" \n",
" Europe | \n",
" 78.6085 | \n",
"
\n",
" \n",
" Oceania | \n",
" 80.7195 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" lifeExp\n",
"continent \n",
"Africa 52.9265\n",
"Americas 72.8990\n",
"Asia 72.3960\n",
"Europe 78.6085\n",
"Oceania 80.7195"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# R dplyr 는\n",
"# gapminder %>%\n",
"# filter(year == 2007) %>% \n",
"# group_by(continent) %>% \n",
"# summarize(median(lifeExp))\n",
"\n",
"gapminder.\\\n",
" query('year == 2007').\\\n",
" groupby('continent').\\\n",
" agg({'lifeExp':'median'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 조인 연산자; inner, left, right, full(outer) join\n",
"R dplyr 예는 다음과 같다.\n",
"```\n",
"(df1 <- data_frame(x = c(1, 2), y = 2:1))\n",
"(df2 <- data_frame(x = c(1, 3), a = 10, b = \"a\"))\n",
"df1 %>% inner_join(df2)\n",
"df1 %>% left_join(df2)\n",
"df1 %>% right_join(df2)\n",
"df1 %>% full_join(df2)\n",
"```\n",
"파이썬 판다스에서는 `DataFrame.merge` 함수로 처리하면 된다."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y\n",
"0 0 2\n",
"1 1 1"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1 = pd.DataFrame(data={'x':range(2), 'y':range(2, 0, -1)})\n",
"df1"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" a | \n",
" b | \n",
" x | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 10 | \n",
" a | \n",
" 1 | \n",
"
\n",
" \n",
" 1 | \n",
" 10 | \n",
" a | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" a b x\n",
"0 10 a 1\n",
"1 10 a 3"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2 = pd.DataFrame(data={'x':[1,3], 'a':10, 'b':\"a\"})\n",
"df2"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 10 | \n",
" a | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y a b\n",
"0 1 1 10 a"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.merge(df2, how=\"inner\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 10.0 | \n",
" a | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y a b\n",
"0 0 2 NaN NaN\n",
"1 1 1 10.0 a"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.merge(df2, how=\"left\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 10 | \n",
" a | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y a b\n",
"0 1 1 10 a"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.merge(df2, how=\"inner\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 1.0 | \n",
" 10 | \n",
" a | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" NaN | \n",
" 10 | \n",
" a | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y a b\n",
"0 1 1.0 10 a\n",
"1 3 NaN 10 a"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.merge(df2, how=\"right\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 2.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 1.0 | \n",
" 10.0 | \n",
" a | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" NaN | \n",
" 10.0 | \n",
" a | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y a b\n",
"0 0 2.0 NaN NaN\n",
"1 1 1.0 10.0 a\n",
"2 3 NaN 10.0 a"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.merge(df2, how=\"outer\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14"
}
},
"nbformat": 4,
"nbformat_minor": 2
}