Skip to content

Instantly share code, notes, and snippets.

@HyeongWookKim
Created June 4, 2020 14:14
Show Gist options
  • Save HyeongWookKim/2cc59fba5701108f96e044c336b586e1 to your computer and use it in GitHub Desktop.
Save HyeongWookKim/2cc59fba5701108f96e044c336b586e1 to your computer and use it in GitHub Desktop.
[Pandas 기초] from "판다스 10분 완성 - 데잇걸즈 2"
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 판다스(Pandas) 기초\n",
"<참고자료 및 코드 출처>\n",
"1. DANDYRILLA님의 github \"판다스(pandas) 기본 사용법 익히기\"\n",
"2. 파이썬 머신러닝 완벽 가이드(권철민 저)\n",
"3. 김도형의 데이터 사이언스 스쿨\n",
"4. R, Python 분석과 프로그래밍의 친구(by R Friend)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**pandas 외에도 배열 구조나 랜덤 값 생성 등의 기능을 활용하기 위한 numpy 와 그래프를 그리기 위한 matplotlib 패키지들도 함께 import**"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:00:58.751811Z",
"start_time": "2020-05-21T06:00:58.023935Z"
}
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 데이터 object 생성하기\n",
"- 데이터 object는 \"데이터를 담고 있는 그릇\"이라고 생각하면 이해하기 쉽다\n",
"- 판다스에서 자주 사용하게 될 데이터 object는 \"Series\" 와 \"DataFrame\"이 있다\n",
"- Series는 데이터를 1차원 배열(칼럼이 하나)로 담고 있고, DataFrame은 데이터를 2차원 배열(칼럼이 여러 개)로 담고 있다\n",
"- DataFrame은 여러 개의 Series로 이루어졌다"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Series는 다음과 같이 값의 리스트를 넘겨줘서 만들 수 있다\n",
"- index의 경우, 0 부터 시작해서 1씩 증가하는 정수 index가 사용된다"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:02.757601Z",
"start_time": "2020-05-21T06:01:02.748625Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 1.0\n",
"1 3.0\n",
"2 5.0\n",
"3 NaN\n",
"4 6.0\n",
"5 8.0\n",
"dtype: float64"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = pd.Series([1, 3, 5, np.nan, 6, 8]) # np.nan 은 \"NaN(Na와 Null을 모두 표현)\"을 의미\n",
"s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### DataFrame은 여러 형태의 데이터를 받아 생성할 수 있다\n",
"- numpy array를 받아서 DataFrame 생성이 가능하다\n",
"- pd.DataFrame() 이라는 클래스 생성자를 사용한다"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:03.359363Z",
"start_time": "2020-05-21T06:01:03.338420Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>-0.435898</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500\n",
"2013-01-06 -1.035226 1.476234 0.109521 -0.435898"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 날짜 값들을 만들기\n",
"dates = pd.date_range('20130101', periods = 6)\n",
"\n",
"# 행에 해당하는 기준인 인덱스를 index라는 인수로 전달\n",
"# 열에 해당하는 기준인 컬럼을 columns라는 인수로 전달\n",
"# <참고> np.random.randn(m, n): 평균 0, 표준편차 1의 표준정규분포 난수로 이루어진 matrix array(m, n)를 생성\n",
"df = pd.DataFrame(np.random.randn(6, 4), index = dates, columns = list('ABCD'))\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 여러 종류의 자료들이 담긴 딕셔너리(dict)를 받아서 DataFrame을 만들 수 있다\n",
" - 딕셔너리의 key 값이 열을 정의하는 column\n",
" - 행을 정의하는 index는 0 부터 시작해서 1씩 증가하는 정수 index"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:03.800274Z",
"start_time": "2020-05-21T06:01:03.783322Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>E</th>\n",
" <th>F</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>2013-01-02</td>\n",
" <td>1.0</td>\n",
" <td>3</td>\n",
" <td>test</td>\n",
" <td>foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2013-01-02</td>\n",
" <td>1.0</td>\n",
" <td>3</td>\n",
" <td>train</td>\n",
" <td>foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.0</td>\n",
" <td>2013-01-02</td>\n",
" <td>1.0</td>\n",
" <td>3</td>\n",
" <td>test</td>\n",
" <td>foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.0</td>\n",
" <td>2013-01-02</td>\n",
" <td>1.0</td>\n",
" <td>3</td>\n",
" <td>train</td>\n",
" <td>foo</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D E F\n",
"0 1.0 2013-01-02 1.0 3 test foo\n",
"1 1.0 2013-01-02 1.0 3 train foo\n",
"2 1.0 2013-01-02 1.0 3 test foo\n",
"3 1.0 2013-01-02 1.0 3 train foo"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2 = pd.DataFrame({'A': 1.,\n",
" 'B': pd.Timestamp('20130102'), # pd.Timestamp() 는 주어진 값을 'yyyy-mm-dd hh:mm:ss' 형태로 반환\n",
" 'C': pd.Series(1, index = list(range(4)), dtype = 'float32'),\n",
" 'D': np.array([3] * 4, dtype = 'int32'),\n",
" 'E': pd.Categorical(['test', 'train', 'test', 'train']),\n",
" 'F': 'foo'})\n",
"df2"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:03.973351Z",
"start_time": "2020-05-21T06:01:03.967369Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A float64\n",
"B datetime64[ns]\n",
"C float32\n",
"D int32\n",
"E category\n",
"F object\n",
"dtype: object"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 위에서 만든 df2의 데이터 타입 확인\n",
"df2.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**<참고> 주피터에서 'df2.'를 입력하고 탭을 누르면, dtypes 외에 다른 속성들을 확인할 수 있다**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 데이터 확인하기\n",
"- 데이터 프레임에 있는 자료들 중, 몇 개의 자료들만 확인해보고 싶다면 .head() 와 .tail() 메소드를 사용하면 된다"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:04.536026Z",
"start_time": "2020-05-21T06:01:04.519074Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 괄호 안에 아무런 숫자도 안 넣으면, default = 5가 적용됨\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:04.725020Z",
"start_time": "2020-05-21T06:01:04.708065Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>-0.435898</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500\n",
"2013-01-06 -1.035226 1.476234 0.109521 -0.435898"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail(3)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:04.906534Z",
"start_time": "2020-05-21T06:01:04.899552Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n",
" '2013-01-05', '2013-01-06'],\n",
" dtype='datetime64[ns]', freq='D')"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 데이터 프레임의 인덱스 확인: .index\n",
"df.index"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:05.087050Z",
"start_time": "2020-05-21T06:01:05.079078Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['A', 'B', 'C', 'D'], dtype='object')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 데이터 프레임의 컬럼 확인: .columns\n",
"df.columns"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:05.272553Z",
"start_time": "2020-05-21T06:01:05.265580Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 4.72835714e-01, -7.60948916e-04, -1.04042872e+00,\n",
" 1.52076047e-01],\n",
" [ 4.61396680e-01, -6.69242026e-01, -2.25293813e-01,\n",
" -9.52451303e-01],\n",
" [ 3.24977169e-01, 1.75157096e-01, -8.39796781e-01,\n",
" -9.37373381e-02],\n",
" [ 9.41575171e-01, -1.21169435e+00, -8.11265968e-01,\n",
" -7.69632027e-02],\n",
" [ 1.45831196e+00, -8.85357733e-01, -1.66074277e+00,\n",
" 2.02150000e+00],\n",
" [-1.03522590e+00, 1.47623394e+00, 1.09521461e-01,\n",
" -4.35897845e-01]])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 데이터 프레임 안에 들어있는 numpy 데이터 확인: .values\n",
"df.values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 데이터 프레임의 기초통계량 확인: .describe() 메소드 사용\n",
" - count\n",
" - mean\n",
" - std\n",
" - min\n",
" - 4분위수(25%, 50%, 75%)\n",
" - max"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:05.662513Z",
"start_time": "2020-05-21T06:01:05.629600Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>6.000000</td>\n",
" <td>6.000000</td>\n",
" <td>6.000000</td>\n",
" <td>6.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.437312</td>\n",
" <td>-0.185944</td>\n",
" <td>-0.744668</td>\n",
" <td>0.102421</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.834212</td>\n",
" <td>0.969788</td>\n",
" <td>0.622823</td>\n",
" <td>1.015729</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>-1.035226</td>\n",
" <td>-1.211694</td>\n",
" <td>-1.660743</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.359082</td>\n",
" <td>-0.831329</td>\n",
" <td>-0.990271</td>\n",
" <td>-0.350358</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.467116</td>\n",
" <td>-0.335001</td>\n",
" <td>-0.825531</td>\n",
" <td>-0.085350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>0.824390</td>\n",
" <td>0.131178</td>\n",
" <td>-0.371787</td>\n",
" <td>0.094816</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>1.458312</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"count 6.000000 6.000000 6.000000 6.000000\n",
"mean 0.437312 -0.185944 -0.744668 0.102421\n",
"std 0.834212 0.969788 0.622823 1.015729\n",
"min -1.035226 -1.211694 -1.660743 -0.952451\n",
"25% 0.359082 -0.831329 -0.990271 -0.350358\n",
"50% 0.467116 -0.335001 -0.825531 -0.085350\n",
"75% 0.824390 0.131178 -0.371787 0.094816\n",
"max 1.458312 1.476234 0.109521 2.021500"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:05.829170Z",
"start_time": "2020-05-21T06:01:05.815223Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>2013-01-01</th>\n",
" <th>2013-01-02</th>\n",
" <th>2013-01-03</th>\n",
" <th>2013-01-04</th>\n",
" <th>2013-01-05</th>\n",
" <th>2013-01-06</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>A</th>\n",
" <td>0.472836</td>\n",
" <td>0.461397</td>\n",
" <td>0.324977</td>\n",
" <td>0.941575</td>\n",
" <td>1.458312</td>\n",
" <td>-1.035226</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.000761</td>\n",
" <td>-0.669242</td>\n",
" <td>0.175157</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.885358</td>\n",
" <td>1.476234</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C</th>\n",
" <td>-1.040429</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.811266</td>\n",
" <td>-1.660743</td>\n",
" <td>0.109521</td>\n",
" </tr>\n",
" <tr>\n",
" <th>D</th>\n",
" <td>0.152076</td>\n",
" <td>-0.952451</td>\n",
" <td>-0.093737</td>\n",
" <td>-0.076963</td>\n",
" <td>2.021500</td>\n",
" <td>-0.435898</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06\n",
"A 0.472836 0.461397 0.324977 0.941575 1.458312 -1.035226\n",
"B -0.000761 -0.669242 0.175157 -1.211694 -0.885358 1.476234\n",
"C -1.040429 -0.225294 -0.839797 -0.811266 -1.660743 0.109521\n",
"D 0.152076 -0.952451 -0.093737 -0.076963 2.021500 -0.435898"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 데이터 프레임을 transpose 시키기: .T 속성(메소드가 아니라 속성)\n",
"df.T"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:06.041650Z",
"start_time": "2020-05-21T06:01:05.960868Z"
}
},
"outputs": [
{
"ename": "TypeError",
"evalue": "'DataFrame' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-13-4dd480cba40b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# .T를 \"메소드\"로 착각하면 안된다!! .T는 \"속성\"이다!!\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;31m# 따라서 .T()로 호출하는 경우 에러가 발생한다\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m: 'DataFrame' object is not callable"
]
}
],
"source": [
"# .T를 \"메소드\"로 착각하면 안된다!! .T는 \"속성\"이다!!\n",
"# 따라서 .T()로 호출하는 경우 에러가 발생한다\n",
"df.T()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 행과 열 이름을 정렬하기: .sort_index() 메소드\n",
" - axis = 0 : index를 기준으로 정렬\n",
" - axis = 1 : column을 기준으로 정렬\n",
" - ascending = True : 오름차순 정렬\n",
" - ascending = False : 내림차순 정렬"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:06.341965Z",
"start_time": "2020-05-21T06:01:06.326009Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>D</th>\n",
" <th>C</th>\n",
" <th>B</th>\n",
" <th>A</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.152076</td>\n",
" <td>-1.040429</td>\n",
" <td>-0.000761</td>\n",
" <td>0.472836</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>-0.952451</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.669242</td>\n",
" <td>0.461397</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>-0.093737</td>\n",
" <td>-0.839797</td>\n",
" <td>0.175157</td>\n",
" <td>0.324977</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>-0.076963</td>\n",
" <td>-0.811266</td>\n",
" <td>-1.211694</td>\n",
" <td>0.941575</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>2.021500</td>\n",
" <td>-1.660743</td>\n",
" <td>-0.885358</td>\n",
" <td>1.458312</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-0.435898</td>\n",
" <td>0.109521</td>\n",
" <td>1.476234</td>\n",
" <td>-1.035226</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" D C B A\n",
"2013-01-01 0.152076 -1.040429 -0.000761 0.472836\n",
"2013-01-02 -0.952451 -0.225294 -0.669242 0.461397\n",
"2013-01-03 -0.093737 -0.839797 0.175157 0.324977\n",
"2013-01-04 -0.076963 -0.811266 -1.211694 0.941575\n",
"2013-01-05 2.021500 -1.660743 -0.885358 1.458312\n",
"2013-01-06 -0.435898 0.109521 1.476234 -1.035226"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.sort_index(axis = 1, ascending = False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 데이터 프레임 내부에 있는 값으로 정렬하기: .sort_values() 메소드"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:06.708965Z",
"start_time": "2020-05-21T06:01:06.694006Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>-0.435898</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737\n",
"2013-01-06 -1.035226 1.476234 0.109521 -0.435898"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 'B' column에 대해 정렬\n",
"df.sort_values(by = \"B\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 데이터 선택하기\n",
"- [] 슬라이싱 사용"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:07.402471Z",
"start_time": "2020-05-21T06:01:07.394494Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2013-01-01 0.472836\n",
"2013-01-02 0.461397\n",
"2013-01-03 0.324977\n",
"2013-01-04 0.941575\n",
"2013-01-05 1.458312\n",
"2013-01-06 -1.035226\n",
"Freq: D, Name: A, dtype: float64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 'A'라는 이름을 가진 column의 데이터만 추출\n",
"df['A']"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:07.659636Z",
"start_time": "2020-05-21T06:01:07.652659Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.series.Series"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(df['A'])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:07.847042Z",
"start_time": "2020-05-21T06:01:07.836059Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 0, 1, 2행을 추출 (특정 '행 범위'의 데이터 추출)\n",
"df[0:3]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:08.079289Z",
"start_time": "2020-05-21T06:01:08.061337Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# index명에 해당하는 값들 추출\n",
"df['20130102':'20130104']"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:08.405847Z",
"start_time": "2020-05-21T06:01:08.353988Z"
}
},
"outputs": [
{
"ename": "KeyError",
"evalue": "'20130102'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2645\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2646\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2647\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: '20130102'",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-20-1c27f7d17bf2>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 특정 행 하나를 가져오고 싶은 경우\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;31m# 다음과 같이 입력하면, '20130102'라는 이름의 'index'가 아니라 'column'을 갖고 있는지 찾게 되므로 에러 발생!!\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'20130102'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2798\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2799\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2800\u001b[1;33m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2801\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2802\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2646\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2647\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2648\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2649\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2650\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msize\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: '20130102'"
]
}
],
"source": [
"# 특정 행 하나를 가져오고 싶은 경우\n",
"# 다음과 같이 입력하면, '20130102'라는 이름의 'index'가 아니라 'column'을 갖고 있는지 찾게 되므로 에러 발생!!\n",
"df['20130102']"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:08.510874Z",
"start_time": "2020-05-21T06:01:08.500903Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 특정 '행 하나'를 선택하고 싶은 경우, 다음과 같이 입력하면 된다\n",
"df['20130102':'20130102']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**<요약>** \n",
"- 데이터 프레임 자체가 갖고 있는 슬라이싱은 다음과 같은 형태로 사용 가능!!\n",
" - df[컬럼명]\n",
" - df[시작 인덱스:끝 인덱스 + 1]\n",
" - df[시작 인덱스명:끝 인덱스명]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 라벨의 이름을 이용(명칭 기반 인덱싱)하여 데이터 선택하기: .loc\n",
"- 행 위치에는 DataFrame index 값을, 열 위치에는 column명을 입력\n",
"- <주의> loc[]에 슬라이싱 기호를 적용하면 (종료 값 - 1)이 아니라 종료 값까지 포함하는 것을 의미!! (명칭은 숫자 형이 아닐 수 있기 때문이다)\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:09.057737Z",
"start_time": "2020-05-21T06:01:09.050788Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 0.472836\n",
"B -0.000761\n",
"C -1.040429\n",
"D 0.152076\n",
"Name: 2013-01-01 00:00:00, dtype: float64"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 첫 번째 index의 값인 '2013-01-01'에 해당하는 모든 column의 값 추출\n",
"df.loc[dates[0]]\n",
"\n",
"# 아래와 같이 입력해도 동일하게 작동함\n",
"# df.loc['20130101']\n",
"# df.loc['2013-01-01']"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:09.208593Z",
"start_time": "2020-05-21T06:01:09.198589Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>1.476234</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B\n",
"2013-01-01 0.472836 -0.000761\n",
"2013-01-02 0.461397 -0.669242\n",
"2013-01-03 0.324977 0.175157\n",
"2013-01-04 0.941575 -1.211694\n",
"2013-01-05 1.458312 -0.885358\n",
"2013-01-06 -1.035226 1.476234"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# column 'A', 'B'에 대한 모든 값 추출\n",
"df.loc[:, ['A', 'B']]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:09.397633Z",
"start_time": "2020-05-21T06:01:09.386664Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B\n",
"2013-01-02 0.461397 -0.669242\n",
"2013-01-03 0.324977 0.175157\n",
"2013-01-04 0.941575 -1.211694"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# index '2013-01-02'부터 '2013-01-04'까지의 column 'A', 'B'의 값 추출\n",
"df.loc['20130102':'20130104', ['A', 'B']]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:09.540713Z",
"start_time": "2020-05-21T06:01:09.530748Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 0.472836\n",
"B -0.000761\n",
"Name: 2013-01-01 00:00:00, dtype: float64"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 특정 index 값의 column 'A', 'B' 값을 추출\n",
"df.loc[dates[0], ['A', 'B']]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:09.981556Z",
"start_time": "2020-05-21T06:01:09.973613Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.4728357137416509"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 특정 index 값과 특정 column에 있는 값을 추출\n",
"df.at[dates[0], 'A']\n",
"\n",
"# 위 코드의 결과는 아래의 코드 결과와 동일함\n",
"#df.loc[dates[0], 'A']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 위치를 나타내는 index 번호를 이용(위치 기반 인덱싱)하여 데이터 선택하기: .iloc\n",
"- 행과 열 값으로 정수형 또는 정수형의 슬라이싱, 팬시 리스트 값을 입력\n",
"- iloc[]에 위치 인덱싱이 아닌 명칭을 입력하면 오류가 발생\n",
" - ex) data_df.iloc[0, 'Name']\n",
"- iloc[]에 문자열 인덱스를 행 위치에 입력해도 오류가 발생\n",
" - ex) data_df.iloc['one', 0]\n",
"- iloc[]는 슬라이싱과 팬시 인덱싱은 제공하나, 명확한 위치 기반 인덱싱이 사용되어야 하는 제약으로 인해 불린 인덱싱은 제공하지 않는다"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:10.310473Z",
"start_time": "2020-05-21T06:01:10.302496Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 0.941575\n",
"B -1.211694\n",
"C -0.811266\n",
"D -0.076963\n",
"Name: 2013-01-04 00:00:00, dtype: float64"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# index 번호(0 부터 시작) 3을 선택\n",
"df.iloc[3]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:10.464152Z",
"start_time": "2020-05-21T06:01:10.451186Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B\n",
"2013-01-04 0.941575 -1.211694\n",
"2013-01-05 1.458312 -0.885358"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 행의 index는 3, 4이므로 네 번째 행과 다섯 번째 행을 선택\n",
"# 열의 index는 0, 1 이므로 첫 번째 열과 두 번째 열을 선택\n",
"df.iloc[3:5, 0:2]"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:10.616793Z",
"start_time": "2020-05-21T06:01:10.603832Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>C</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.225294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>-0.839797</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-1.660743</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A C\n",
"2013-01-02 0.461397 -0.225294\n",
"2013-01-03 0.324977 -0.839797\n",
"2013-01-05 1.458312 -1.660743"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 행과 열의 index를 리스트로 넘겨주기\n",
"# 두 번째, 세 번째, 다섯 번째 행과 첫 번째, 세 번째 열을 선택\n",
"df.iloc[[1, 2, 4], [0, 2]]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:10.758966Z",
"start_time": "2020-05-21T06:01:10.749979Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 슬라이싱을 이용해서 행 또는 열 전체를 선택\n",
"df.iloc[1:3, :]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:10.945932Z",
"start_time": "2020-05-21T06:01:10.935945Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" B C\n",
"2013-01-01 -0.000761 -1.040429\n",
"2013-01-02 -0.669242 -0.225294\n",
"2013-01-03 0.175157 -0.839797\n",
"2013-01-04 -1.211694 -0.811266\n",
"2013-01-05 -0.885358 -1.660743\n",
"2013-01-06 1.476234 0.109521"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[:, 1:3]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:11.087208Z",
"start_time": "2020-05-21T06:01:11.080235Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"-0.6692420264543495"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 값 하나를 선택\n",
"df.iloc[1, 1]\n",
"\n",
"# 아래의 코드도 위의 코드와 동일한 결과를 반환해준다\n",
"# df.iat[1, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 불린 인덱싱(조건 설정)을 사용하여 데이터 선택하기\n",
"- 보통 이걸 가장 많이 사용하므로 잘 기억해두자!!\n",
"- 특정한 열의 값들을 기준으로 조건을 만들어서, 해당 조건에 만족하는 '행'들만 선택"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:11.720411Z",
"start_time": "2020-05-21T06:01:11.705449Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>-0.000761</td>\n",
" <td>-1.040429</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-0.952451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-0.076963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 'A'라는 열에 들어있는 값이 양수인 경우에 해당하는 '행'들을 선택\n",
"df[df.A > 0]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:11.915480Z",
"start_time": "2020-05-21T06:01:11.888552Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.472836</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.152076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2.021500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>NaN</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"2013-01-01 0.472836 NaN NaN 0.152076\n",
"2013-01-02 0.461397 NaN NaN NaN\n",
"2013-01-03 0.324977 0.175157 NaN NaN\n",
"2013-01-04 0.941575 NaN NaN NaN\n",
"2013-01-05 1.458312 NaN NaN 2.021500\n",
"2013-01-06 NaN 1.476234 0.109521 NaN"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 각 값을 기준으로 조건 만들기 (개별 선택)\n",
"# 조건을 값이 양수인 것들로 설정하면, 나머지 값들(0 또는 음수)은 NaN으로!\n",
"df[df > 0]"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:12.065243Z",
"start_time": "2020-05-21T06:01:12.040345Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" A B C D E\n",
"2013-01-01 0.472836 -0.000761 -1.040429 0.152076 one\n",
"2013-01-02 0.461397 -0.669242 -0.225294 -0.952451 one\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737 two\n",
"2013-01-04 0.941575 -1.211694 -0.811266 -0.076963 three\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500 four\n",
"2013-01-06 -1.035226 1.476234 0.109521 -0.435898 three\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-0.093737</td>\n",
" <td>two</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>2.021500</td>\n",
" <td>four</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D E\n",
"2013-01-03 0.324977 0.175157 -0.839797 -0.093737 two\n",
"2013-01-05 1.458312 -0.885358 -1.660743 2.021500 four"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 필터링을 해야 하는 경우: isin() 메소드 사용\n",
"# 'E'라는 새로운 열 하나를 추가한 후, 새롭게 추가된 열에 들어있는 값을 기준으로 행을 선택\n",
"df2 = df.copy() # 원본 데이터 유지를 위해 복사본 사용\n",
"df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']\n",
"print(df2)\n",
"\n",
"df2[df2['E'].isin(['two', 'four'])]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 데이터 변경하기\n",
"- 데이터 프레임의 특정 값들을 다른 값으로 변경 가능"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:12.412526Z",
"start_time": "2020-05-21T06:01:12.405546Z"
}
},
"outputs": [],
"source": [
"s1 = pd.Series([1, 2, 3, 4, 5, 6], index = pd.date_range('20130102', periods = 6))\n",
"s1\n",
"\n",
"df['F'] = s1"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:12.597289Z",
"start_time": "2020-05-21T06:01:12.589311Z"
}
},
"outputs": [],
"source": [
"# 데이터 프레임의 특정 값 하나를 선택하여 다른 값으로 변경\n",
"df.at[dates[0], 'A'] = 0\n",
"\n",
"# 위치(index 번호)를 이용한 변경도 가능\n",
"df.iloc[0, 1] = 0\n",
"\n",
"# 여러 값을 한꺼번에 변경하고 싶은 경우, 데이터의 크기만 잘 맞춰주면 된다\n",
"df.loc[:, 'D'] = np.array([5] * len(df))"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:12.969902Z",
"start_time": "2020-05-21T06:01:12.955973Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-1.040429</td>\n",
" <td>5</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>5</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>5</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>5</td>\n",
" <td>3.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>5</td>\n",
" <td>4.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>1.476234</td>\n",
" <td>0.109521</td>\n",
" <td>5</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F\n",
"2013-01-01 0.000000 0.000000 -1.040429 5 NaN\n",
"2013-01-02 0.461397 -0.669242 -0.225294 5 1.0\n",
"2013-01-03 0.324977 0.175157 -0.839797 5 2.0\n",
"2013-01-04 0.941575 -1.211694 -0.811266 5 3.0\n",
"2013-01-05 1.458312 -0.885358 -1.660743 5 4.0\n",
"2013-01-06 -1.035226 1.476234 0.109521 5 5.0"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 위에서 변경한 데이터들을 모두 적용한 데이터 프레임의 값들을 확인\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:13.128301Z",
"start_time": "2020-05-21T06:01:13.105365Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-1.040429</td>\n",
" <td>-5</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>-0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>-5</td>\n",
" <td>-1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>-0.324977</td>\n",
" <td>-0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>-5</td>\n",
" <td>-2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>-0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>-5</td>\n",
" <td>-3.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>-1.458312</td>\n",
" <td>-0.885358</td>\n",
" <td>-1.660743</td>\n",
" <td>-5</td>\n",
" <td>-4.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>-1.035226</td>\n",
" <td>-1.476234</td>\n",
" <td>-0.109521</td>\n",
" <td>-5</td>\n",
" <td>-5.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F\n",
"2013-01-01 0.000000 0.000000 -1.040429 -5 NaN\n",
"2013-01-02 -0.461397 -0.669242 -0.225294 -5 -1.0\n",
"2013-01-03 -0.324977 -0.175157 -0.839797 -5 -2.0\n",
"2013-01-04 -0.941575 -1.211694 -0.811266 -5 -3.0\n",
"2013-01-05 -1.458312 -0.885358 -1.660743 -5 -4.0\n",
"2013-01-06 -1.035226 -1.476234 -0.109521 -5 -5.0"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 불린 인덱싱(조건 설정)을 이용한 데이터 선택 방법을 사용하여, 특정 조건을 만족하는 값들만 변경\n",
"# ex) 양수의 값을 가지는 값들에 한해서 음수로 변경\n",
"df2 = df.copy()\n",
"df2[df2 > 0] = -df2\n",
"df2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### DataFrame과 리스트, 딕셔너리, 넘파이 ndarray 상호 변환\n",
"\n",
"**리스트, ndarray에서 DataFrame변환**"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:13.413091Z",
"start_time": "2020-05-21T06:01:13.400159Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"array1 shape: (3,)\n",
"1차원 리스트로 만든 DataFrame:\n",
" col1\n",
"0 1\n",
"1 2\n",
"2 3\n",
"1차원 ndarray로 만든 DataFrame:\n",
" col1\n",
"0 1\n",
"1 2\n",
"2 3\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"col_name1 = ['col1']\n",
"list1 = [1, 2, 3]\n",
"array1 = np.array(list1)\n",
"print('array1 shape:', array1.shape)\n",
"\n",
"df_list1 = pd.DataFrame(list1, columns = col_name1)\n",
"print('1차원 리스트로 만든 DataFrame:\\n', df_list1)\n",
"\n",
"df_array1 = pd.DataFrame(array1, columns = col_name1)\n",
"print('1차원 ndarray로 만든 DataFrame:\\n', df_array1)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:13.596302Z",
"start_time": "2020-05-21T06:01:13.582341Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"array2 shape: (2, 3)\n",
"2차원 리스트로 만든 DataFrame:\n",
" col1 col2 col3\n",
"0 1 2 3\n",
"1 11 12 13\n",
"2차원 ndarray로 만든 DataFrame:\n",
" col1 col2 col3\n",
"0 1 2 3\n",
"1 11 12 13\n"
]
}
],
"source": [
"# 3개의 컬럼명이 필요함\n",
"col_name2 = ['col1', 'col2', 'col3']\n",
"\n",
"# 2행 x 3열 형태의 리스트와 ndarray 생성 한 뒤, 이를 DataFrame으로 변환\n",
"list2 = [[1, 2, 3],\n",
" [11, 12, 13]]\n",
"array2 = np.array(list2)\n",
"print('array2 shape:', array2.shape)\n",
"\n",
"df_list2 = pd.DataFrame(list2, columns = col_name2)\n",
"print('2차원 리스트로 만든 DataFrame:\\n', df_list2)\n",
"\n",
"df_array1 = pd.DataFrame(array2, columns = col_name2)\n",
"print('2차원 ndarray로 만든 DataFrame:\\n', df_array1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**딕셔너리(dict)에서 DataFrame변환**"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:14.142279Z",
"start_time": "2020-05-21T06:01:14.133272Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"딕셔너리로 만든 DataFrame:\n",
" col1 col2 col3\n",
"0 1 2 3\n",
"1 11 22 33\n"
]
}
],
"source": [
"# Key는 컬럼명으로 매핑, Value는 리스트 형(또는 ndarray)\n",
"dict = {'col1':[1, 11], 'col2':[2, 22], 'col3':[3, 33]}\n",
"df_dict = pd.DataFrame(dict)\n",
"print('딕셔너리로 만든 DataFrame:\\n', df_dict)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**DataFrame을 ndarray로 변환**\n",
"- values를 이용한 ndarray로의 변환은 매우 많이 사용되므로 반드시 기억하자!!"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:14.805140Z",
"start_time": "2020-05-21T06:01:14.799158Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"df_dict.values 타입: <class 'numpy.ndarray'> df_dict.values shape: (2, 3)\n",
"[[ 1 2 3]\n",
" [11 22 33]]\n"
]
}
],
"source": [
"# DataFrame을 ndarray로 변환\n",
"array3 = df_dict.values\n",
"print('df_dict.values 타입:', type(array3), 'df_dict.values shape:', array3.shape)\n",
"print(array3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**DataFrame을 리스트와 딕셔너리로 변환**\n",
"- 리스트로의 변환은 values에서 얻은 ndarray에서 tolist()를 호출\n",
"- 딕셔너리로의 변환은 DataFrame 객체의 to_dict() 메소드를 호출하는데, 인자로 'list'를 입력하면 딕셔너리의 값이 리스트형으로 반환"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:15.209860Z",
"start_time": "2020-05-21T06:01:15.203878Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"df_dict.values.tolist() 타입: <class 'list'>\n",
"[[1, 2, 3], [11, 22, 33]]\n",
"\n",
" df_dict.to_dict() 타입: <class 'dict'>\n",
"{'col1': [1, 11], 'col2': [2, 22], 'col3': [3, 33]}\n"
]
}
],
"source": [
"# DataFrame을 리스트로 변환\n",
"list3 = df_dict.values.tolist()\n",
"print('df_dict.values.tolist() 타입:', type(list3))\n",
"print(list3)\n",
"\n",
"# DataFrame을 딕셔너리로 변환\n",
"dict3 = df_dict.to_dict('list') # 'list'를 입력해주지 않으면, {0:1, 1:11, ...} 이런 식으로 반환됨\n",
"print('\\n df_dict.to_dict() 타입:', type(dict3))\n",
"print(dict3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataFrame 데이터 삭제하기\n",
"- drop() 메소드를 사용\n",
"- DataFrame.drop(labels = None, axis = 0, index = None, columns = None, level = None, inplace = False, errors = 'raise')\n",
"- 위에서 가장 중요한 파라미터는 labels, axis, inplace 이다\n",
" - axis = 0: row 방향 축 --> 이상치 데이터를 삭제하는 경우에 주로 사용!!\n",
" - axis = 1: column 방향 축 --> 기존 column 값을 가공해서 새로운 column을 만들고 삭제(일반적으로 axis = 1을 쓰는 경우가 많음)\n",
" - inplace = False: 원본 DataFrame은 유지하고 drop된 DataFrame을 새롭게 객체 변수로 받고 싶은 경우\n",
" - inplace = True: 원본 DataFrame에 drop된 결과를 적용할 경우\n",
"\n",
"**inplace = True 와 inplace = False 둘 중, 하나를 딱 정해서 사용하자. 그래야 헷갈리지 않는다!!**\n",
"- 개인적으로 나는 inplace = False 로 통일해서 사용하는 걸로!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Index 객체\n",
"- DataFrame, Series에서 Index 객체만 추출하려면, DataFrame.index 또는 Series.index 속성을 통해 가능\n",
"- Index는 오직 식별용으로만 사용\n",
"- 한 번 만들어진 DataFrame 및 Series의 Index 객체는 함부로 변경할 수 없다\n",
"- DataFrame 및 Series에 reset_index() 메소드를 수행하면, 새롭게 인덱스를 연속 숫자형으로 할당하며 기존 인덱스는 'index'라는 새로운 칼럼 명으로 추가\n",
" - 인덱스가 연속된 int 숫자형 데이터가 아닐 경우에, 다시 이를 연속 int 숫자형 데이터로 만들 때 주로 사용!!\n",
" - Series에 reset_index()를 적용하면, Series가 아닌 DataFrame이 반환!!\n",
" - reset_index()의 파라미터 중, drop = True로 설정하면 기존 인덱스는 새로운 칼럼으로 추가되지 않고 삭제(drop)된다!!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 결측치(Missing Data) 처리하기\n",
"- 결측 데이터는 column에 값이 없는, 즉 NULL인 경우를 의미한다\n",
"- 기본적으로 머신러닝 알고리즘은 이 NaN 값을 처리하지 않으므로, 이 값을 다른 값으로 대체해야 한다\n",
" - NaN 값은 평균, 총합 등의 함수 연산 시 제외된다!\n",
"- 판다스(pandas)에서는 결측치를 np.nan 으로 나타내며, 기본적으로 연산에서 제외시킨다"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:17.540241Z",
"start_time": "2020-05-21T06:01:17.521291Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-1.040429</td>\n",
" <td>5</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>5</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>5</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F E\n",
"2013-01-01 0.000000 0.000000 -1.040429 5 NaN 1.0\n",
"2013-01-02 0.461397 -0.669242 -0.225294 5 1.0 1.0\n",
"2013-01-03 0.324977 0.175157 -0.839797 5 2.0 NaN\n",
"2013-01-04 0.941575 -1.211694 -0.811266 5 3.0 NaN"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 재 인덱싱(reindex)은 해당 축에 대하여 index를 변경/추가/삭제\n",
"df1 = df.reindex(index = dates[0:4], columns = list(df.columns) + ['E'])\n",
"df1.loc[dates[0]:dates[1], 'E'] = 1\n",
"df1"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:17.758121Z",
"start_time": "2020-05-21T06:01:17.741201Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F E\n",
"2013-01-01 False False False False True False\n",
"2013-01-02 False False False False False False\n",
"2013-01-03 False False False False False True\n",
"2013-01-04 False False False False False True"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 해당 값이 결측치인지 아닌지 확인하고자 하는 경우: isna() 메소드 사용\n",
"# 결측치이면 True, 값이 있으면 False를 반환\n",
"pd.isna(df1)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:17.898955Z",
"start_time": "2020-05-21T06:01:17.889018Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 0\n",
"B 0\n",
"C 0\n",
"D 0\n",
"F 1\n",
"E 2\n",
"dtype: int64"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 결측치의 개수는 isna() 결과에 sum() 함수를 추가해서 구할 수 있다\n",
"df1.isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:18.087908Z",
"start_time": "2020-05-21T06:01:18.071951Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F E\n",
"2013-01-02 0.461397 -0.669242 -0.225294 5 1.0 1.0"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 결측치가 하나라도 존재하는 행들을 버리고 싶은 경우: dropna() 메소드 사용\n",
"df1.dropna(how = 'any')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*<주의>* - *inplace 파라미터*\n",
"- fillna()를 이용해 반환 값을 다시 받거나, inplace = True 파라미터를 fillna()에 추가해야 실제 데이터 세트 값이 변경된다!!"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:18.384527Z",
"start_time": "2020-05-21T06:01:18.369569Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-1.040429</td>\n",
" <td>5</td>\n",
" <td>5.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-0.225294</td>\n",
" <td>5</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.324977</td>\n",
" <td>0.175157</td>\n",
" <td>-0.839797</td>\n",
" <td>5</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>0.941575</td>\n",
" <td>-1.211694</td>\n",
" <td>-0.811266</td>\n",
" <td>5</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F E\n",
"2013-01-01 0.000000 0.000000 -1.040429 5 5.0 1.0\n",
"2013-01-02 0.461397 -0.669242 -0.225294 5 1.0 1.0\n",
"2013-01-03 0.324977 0.175157 -0.839797 5 2.0 5.0\n",
"2013-01-04 0.941575 -1.211694 -0.811266 5 3.0 5.0"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 결측치가 있는 부분을 다른 값으로 채우고 싶은 경우: fillna() 메소드 사용\n",
"df1.fillna(value = 5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 연산(Operations)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 통계적 지표들 (Stats)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:18.854345Z",
"start_time": "2020-05-21T06:01:18.846367Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 0.358506\n",
"B -0.185817\n",
"C -0.744668\n",
"D 5.000000\n",
"F 3.000000\n",
"dtype: float64"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 평균 구하기 (default인 axis = 0을 기준으로 평균이 구해진다)\n",
"df.mean()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:19.040207Z",
"start_time": "2020-05-21T06:01:19.032263Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2013-01-01 0.989893\n",
"2013-01-02 1.113372\n",
"2013-01-03 1.332067\n",
"2013-01-04 1.383723\n",
"2013-01-05 1.582442\n",
"2013-01-06 2.110106\n",
"Freq: D, dtype: float64"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 열(axis = 1) 축에 대해서 평균 구하기\n",
"df.mean(axis = 1)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:19.192384Z",
"start_time": "2020-05-21T06:01:19.177427Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>-0.675023</td>\n",
" <td>-0.824843</td>\n",
" <td>-1.839797</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>-2.058425</td>\n",
" <td>-4.211694</td>\n",
" <td>-3.811266</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>-3.541688</td>\n",
" <td>-5.885358</td>\n",
" <td>-6.660743</td>\n",
" <td>0.0</td>\n",
" <td>-1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F\n",
"2013-01-01 NaN NaN NaN NaN NaN\n",
"2013-01-02 NaN NaN NaN NaN NaN\n",
"2013-01-03 -0.675023 -0.824843 -1.839797 4.0 1.0\n",
"2013-01-04 -2.058425 -4.211694 -3.811266 2.0 0.0\n",
"2013-01-05 -3.541688 -5.885358 -6.660743 0.0 -1.0\n",
"2013-01-06 NaN NaN NaN NaN NaN"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 서로 차원이 달라서 index를 맞추어야 하는 두 object 간의 연산\n",
"# pandas는 맞추어야 할 축만 지정해주면, 자동으로 해당 축을 기준으로 맞추어 연산을 수행\n",
"\n",
"# 기존 데이터 프레임의 index가 2013-01-03, 04, 05인 모든 column에 해당하는 값에, 각 1.0, 3.0, 5.0 을 빼준 값이 결과로 나온다\n",
"# 결측치가 존재하는 경우에는 계산이 불가능하므로 NaN 으로 표시된다\n",
"s = pd.Series([1, 3, 5, np.nan, 6, 8], index = dates).shift(2) # shift를 사용하면, index는 그대로 두고 데이터만 이동!\n",
"df.sub(s, axis = 'index') # index를 기준으로 '빼기' 연산을 수행"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 데이터 프레임에 함수 적용하기(Apply)\n",
"- 판다스는 apply 함수에 lambda 식을 결합해 DataFrame이나 Series의 레코드 별로 데이터를 가공하는 기능을 제공한다\n",
"- apply lambda 식으로 데이터를 가공하는 방법은 자주 사용하므로 잘 기억해두자!!\n",
" - ex) lambda x: x ** 2\n",
" - 위 예시에서 앞의 x 는 '입력 인자', 뒤의 x ** 2 는 입력 인자를 기반으로 한 계산식이며, 호출 시 계산 결과가 반환된다\n",
"- lambda 식을 이용할 때, 여러 개의 값을 입력 인자로 사용해야 할 경우, 보통 map() 함수를 결합해서 사용한다\n",
" - ex) a = [1, 2, 3]\n",
" squares = map(lambda x: x ** 2, a)\n",
" list(squares)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:19.491892Z",
"start_time": "2020-05-21T06:01:19.469933Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2013-01-01</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-1.040429</td>\n",
" <td>5</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-02</th>\n",
" <td>0.461397</td>\n",
" <td>-0.669242</td>\n",
" <td>-1.265723</td>\n",
" <td>10</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-03</th>\n",
" <td>0.786374</td>\n",
" <td>-0.494085</td>\n",
" <td>-2.105519</td>\n",
" <td>15</td>\n",
" <td>3.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-04</th>\n",
" <td>1.727949</td>\n",
" <td>-1.705779</td>\n",
" <td>-2.916785</td>\n",
" <td>20</td>\n",
" <td>6.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-05</th>\n",
" <td>3.186261</td>\n",
" <td>-2.591137</td>\n",
" <td>-4.577528</td>\n",
" <td>25</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013-01-06</th>\n",
" <td>2.151035</td>\n",
" <td>-1.114903</td>\n",
" <td>-4.468007</td>\n",
" <td>30</td>\n",
" <td>15.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D F\n",
"2013-01-01 0.000000 0.000000 -1.040429 5 NaN\n",
"2013-01-02 0.461397 -0.669242 -1.265723 10 1.0\n",
"2013-01-03 0.786374 -0.494085 -2.105519 15 3.0\n",
"2013-01-04 1.727949 -1.705779 -2.916785 20 6.0\n",
"2013-01-05 3.186261 -2.591137 -4.577528 25 10.0\n",
"2013-01-06 2.151035 -1.114903 -4.468007 30 15.0"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.apply(np.cumsum) # np.cumsum(): 누적 합계"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:19.629251Z",
"start_time": "2020-05-21T06:01:19.620278Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"A 2.493538\n",
"B 2.687928\n",
"C 1.770264\n",
"D 0.000000\n",
"F 4.000000\n",
"dtype: float64"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.apply(lambda x: x.max() - x.min())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 히스토그램 구하기(Histogramming)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:19.924417Z",
"start_time": "2020-05-21T06:01:19.913470Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 2\n",
"1 6\n",
"2 2\n",
"3 1\n",
"4 2\n",
"5 4\n",
"6 0\n",
"7 0\n",
"8 4\n",
"9 4\n",
"dtype: int32\n"
]
},
{
"data": {
"text/plain": [
"4 3\n",
"2 3\n",
"0 2\n",
"6 1\n",
"1 1\n",
"dtype: int64"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 데이터의 값들의 빈도를 조사하여 히스토그램 만들기\n",
"s = pd.Series(np.random.randint(0, 7, size = 10))\n",
"print(s)\n",
"\n",
"s.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 문자열 관련 메소드들(String Methods)\n",
"- Series는 배열의 각 요소에 쉽게 적용이 가능하도록 str 이라는 속성에 문자열을 처리할 수 있는 여러 가지 메소드들을 갖추고 있다\n",
"- 문자열 내에서의 패턴을 찾기 위한 작업들은 일반적으로 '정규표현식'을 사용하는 것에 유의!"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:20.213517Z",
"start_time": "2020-05-21T06:01:20.205541Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 a\n",
"1 b\n",
"2 c\n",
"3 aaba\n",
"4 baca\n",
"5 NaN\n",
"6 caba\n",
"7 dog\n",
"8 cat\n",
"dtype: object"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])\n",
"s.str.lower() # 각 요소 값들을 모두 소문자로 변경"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 합치기(Merging)\n",
"- 다양한 정보를 담은 자료들을 합쳐서, 새로운 자료를 만들어야 하는 경우에 사용"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Concat\n",
"- 같은 형태의 자료들을 이어 하나로 만들어준다\n",
"- concat 메소드 관련 사이트: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html#concatenating-objects"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:20.746108Z",
"start_time": "2020-05-21T06:01:20.726164Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-0.808655</td>\n",
" <td>-0.178923</td>\n",
" <td>0.487119</td>\n",
" <td>-0.427400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.191072</td>\n",
" <td>0.071646</td>\n",
" <td>0.095561</td>\n",
" <td>1.174140</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.432226</td>\n",
" <td>1.027590</td>\n",
" <td>1.516764</td>\n",
" <td>-0.386455</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-1.719182</td>\n",
" <td>0.094227</td>\n",
" <td>-0.819980</td>\n",
" <td>-0.504760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.645324</td>\n",
" <td>-0.074010</td>\n",
" <td>-0.533842</td>\n",
" <td>0.407079</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-0.879944</td>\n",
" <td>-0.024651</td>\n",
" <td>-1.181698</td>\n",
" <td>-0.670168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-0.281970</td>\n",
" <td>-0.677789</td>\n",
" <td>0.265645</td>\n",
" <td>-0.675350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.093248</td>\n",
" <td>-1.028898</td>\n",
" <td>0.506544</td>\n",
" <td>-0.694781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-0.939844</td>\n",
" <td>-1.400401</td>\n",
" <td>-0.799056</td>\n",
" <td>1.473795</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-1.470519</td>\n",
" <td>0.741310</td>\n",
" <td>0.634705</td>\n",
" <td>-0.391076</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"0 -0.808655 -0.178923 0.487119 -0.427400\n",
"1 0.191072 0.071646 0.095561 1.174140\n",
"2 -0.432226 1.027590 1.516764 -0.386455\n",
"3 -1.719182 0.094227 -0.819980 -0.504760\n",
"4 0.645324 -0.074010 -0.533842 0.407079\n",
"5 -0.879944 -0.024651 -1.181698 -0.670168\n",
"6 -0.281970 -0.677789 0.265645 -0.675350\n",
"7 0.093248 -1.028898 0.506544 -0.694781\n",
"8 -0.939844 -1.400401 -0.799056 1.473795\n",
"9 -1.470519 0.741310 0.634705 -0.391076"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 임의의 수를 담고있는 10 x 4 형태의 데이터 프레임 생성\n",
"df = pd.DataFrame(np.random.randn(10, 4))\n",
"\n",
"# 만들어진 데이터 프레임을 세 부분(row 기준)으로 분할\n",
"pieces = [df[:3], df[3:7], df[7:]]\n",
"\n",
"# pandas에 있는 concat 메소드를 사용하여, 데이터 프레임을 원래대로 다시 합치기\n",
"pd.concat(pieces)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Join\n",
"- 데이터베이스에서 사용하는 SQL 스타일의 합치기 기능\n",
"- merge 메소드를 통해 이루어진다"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:21.083207Z",
"start_time": "2020-05-21T06:01:21.056280Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" key lval\n",
"0 foo 1\n",
"1 foo 2\n",
"\n",
" key rval\n",
"0 foo 4\n",
"1 foo 5\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>key</th>\n",
" <th>lval</th>\n",
" <th>rval</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>foo</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>foo</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>foo</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>foo</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" key lval rval\n",
"0 foo 1 4\n",
"1 foo 1 5\n",
"2 foo 2 4\n",
"3 foo 2 5"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# key 값을 중복으로 가질 때, merge 메소드의 작동 방식\n",
"# 보통 key로 사용하는 값은 중복일 경우가 잘 없지만, 만약 중복된 값이 있을 경우에는 모든 경우의 수를 만들어내는 작동 방식!!\n",
"left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})\n",
"right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})\n",
"print(left)\n",
"print()\n",
"print(right)\n",
"\n",
"merged = pd.merge(left, right, on = 'key') # merge 기준을 'key'로 설정\n",
"merged"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:21.228820Z",
"start_time": "2020-05-21T06:01:21.203885Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" key lval\n",
"0 foo 1\n",
"1 bar 2\n",
"\n",
" key rval\n",
"0 foo 4\n",
"1 bar 5\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>key</th>\n",
" <th>lval</th>\n",
" <th>rval</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>foo</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bar</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" key lval rval\n",
"0 foo 1 4\n",
"1 bar 2 5"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# key 값을 중복으로 가지지 않을 때, merge 메소드의 작동 방식\n",
"left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})\n",
"right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})\n",
"print(left)\n",
"print()\n",
"print(right)\n",
"\n",
"merged = pd.merge(left, right, on = 'key')\n",
"merged"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Append\n",
"- 데이터 프레임의 맨 뒤에 행을 추가한다\n",
"- append 메소드 관련 사이트: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html#merging-concatenation"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:21.561925Z",
"start_time": "2020-05-21T06:01:21.539985Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.548845</td>\n",
" <td>0.979803</td>\n",
" <td>-1.466482</td>\n",
" <td>0.164177</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-1.020548</td>\n",
" <td>1.370382</td>\n",
" <td>-2.089888</td>\n",
" <td>0.430789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.462215</td>\n",
" <td>-0.466806</td>\n",
" <td>0.395783</td>\n",
" <td>-1.695677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.232238</td>\n",
" <td>-0.633204</td>\n",
" <td>0.302578</td>\n",
" <td>-0.309603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.347692</td>\n",
" <td>-1.017691</td>\n",
" <td>1.191371</td>\n",
" <td>1.473029</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.946739</td>\n",
" <td>0.060351</td>\n",
" <td>1.521950</td>\n",
" <td>1.294958</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-0.297713</td>\n",
" <td>-0.526382</td>\n",
" <td>-0.109674</td>\n",
" <td>-0.343933</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>-0.553328</td>\n",
" <td>0.241240</td>\n",
" <td>-0.811586</td>\n",
" <td>0.408618</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.232238</td>\n",
" <td>-0.633204</td>\n",
" <td>0.302578</td>\n",
" <td>-0.309603</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"0 0.548845 0.979803 -1.466482 0.164177\n",
"1 -1.020548 1.370382 -2.089888 0.430789\n",
"2 -0.462215 -0.466806 0.395783 -1.695677\n",
"3 0.232238 -0.633204 0.302578 -0.309603\n",
"4 -0.347692 -1.017691 1.191371 1.473029\n",
"5 0.946739 0.060351 1.521950 1.294958\n",
"6 -0.297713 -0.526382 -0.109674 -0.343933\n",
"7 -0.553328 0.241240 -0.811586 0.408618\n",
"8 0.232238 -0.633204 0.302578 -0.309603"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 4번째 행을 기존의 데이터 프레임의 맨 뒤에 한 번 더 추가\n",
"df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])\n",
"\n",
"s = df.iloc[3] # index 번호가 3. 즉, 4번째 행을 의미\n",
"df.append(s, ignore_index = True) # ignore_index = True 를 설정해주면, index 이름을 무시한다"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 그룹화 = 묶기(Grouping)\n",
"- 어떠한 기준을 바탕으로 데이터를 나누는 일(splitting)\n",
"- 각 그룹에 어떤 함수를 독립적으로 적용시키는 일(applying)\n",
"- 적용되어 나온 결과들을 통합하는 일(combining)\n",
"- grouping 관련 사이트: https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#groupby"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:21.875152Z",
"start_time": "2020-05-21T06:01:21.862187Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>foo</td>\n",
" <td>one</td>\n",
" <td>-1.062168</td>\n",
" <td>-1.658541</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bar</td>\n",
" <td>one</td>\n",
" <td>-0.537435</td>\n",
" <td>0.294346</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>foo</td>\n",
" <td>two</td>\n",
" <td>-0.457747</td>\n",
" <td>0.457779</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>bar</td>\n",
" <td>three</td>\n",
" <td>0.215592</td>\n",
" <td>-0.538010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>foo</td>\n",
" <td>two</td>\n",
" <td>0.897209</td>\n",
" <td>-2.013092</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>bar</td>\n",
" <td>two</td>\n",
" <td>-0.518347</td>\n",
" <td>0.628899</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>foo</td>\n",
" <td>one</td>\n",
" <td>-0.122072</td>\n",
" <td>1.753600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>foo</td>\n",
" <td>three</td>\n",
" <td>0.441977</td>\n",
" <td>-1.818391</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D\n",
"0 foo one -1.062168 -1.658541\n",
"1 bar one -0.537435 0.294346\n",
"2 foo two -0.457747 0.457779\n",
"3 bar three 0.215592 -0.538010\n",
"4 foo two 0.897209 -2.013092\n",
"5 bar two -0.518347 0.628899\n",
"6 foo one -0.122072 1.753600\n",
"7 foo three 0.441977 -1.818391"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',\n",
" 'foo', 'bar', 'foo', 'foo'],\n",
" 'B': ['one', 'one', 'two', 'three',\n",
" 'two', 'two', 'one', 'three'],\n",
" 'C': np.random.randn(8),\n",
" 'D': np.random.randn(8)}) # np.random.randn(): 표준 정규 분포에서 난수 matrix array 생성\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:22.023962Z",
"start_time": "2020-05-21T06:01:22.011996Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" <tr>\n",
" <th>A</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>bar</th>\n",
" <td>-0.840191</td>\n",
" <td>0.385235</td>\n",
" </tr>\n",
" <tr>\n",
" <th>foo</th>\n",
" <td>-0.302801</td>\n",
" <td>-3.278645</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" C D\n",
"A \n",
"bar -0.840191 0.385235\n",
"foo -0.302801 -3.278645"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 'A' column 값을 기준으로 그룹을 묶고, 각 그룹의 합계 구하기\n",
"df.groupby('A').sum()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:22.207875Z",
"start_time": "2020-05-21T06:01:22.193913Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" <tr>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">bar</th>\n",
" <th>one</th>\n",
" <td>-0.537435</td>\n",
" <td>0.294346</td>\n",
" </tr>\n",
" <tr>\n",
" <th>three</th>\n",
" <td>0.215592</td>\n",
" <td>-0.538010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>two</th>\n",
" <td>-0.518347</td>\n",
" <td>0.628899</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">foo</th>\n",
" <th>one</th>\n",
" <td>-1.184240</td>\n",
" <td>0.095059</td>\n",
" </tr>\n",
" <tr>\n",
" <th>three</th>\n",
" <td>0.441977</td>\n",
" <td>-1.818391</td>\n",
" </tr>\n",
" <tr>\n",
" <th>two</th>\n",
" <td>0.439463</td>\n",
" <td>-1.555313</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" C D\n",
"A B \n",
"bar one -0.537435 0.294346\n",
" three 0.215592 -0.538010\n",
" two -0.518347 0.628899\n",
"foo one -1.184240 0.095059\n",
" three 0.441977 -1.818391\n",
" two 0.439463 -1.555313"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 여러 column을 기준으로 그룹을 묶기\n",
"df.groupby(['A', 'B']).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### groupby( )에서 agg( ) 활용법\n",
"- SQL의 경우, 서로 다른 aggregation 함수를 적용할 경우에는 Select 절에 나열하기만 하면 된다\n",
" - aggregation 함수: ex) min(), max(), sum(), count() 등...\n",
" - ex) Select count(PassengerId), count(Survived), ...\n",
" from titanic_table\n",
" group by Pclass\n",
"- 여러 개의 column이 서로 다른 aggregation 함수를 groupby에서 호출하려면, agg()를 이용해서 SQL과 같은 처리가 가능\n",
" - DataFrame groupby()의 경우, 적용하려는 여러 개의 aggregation 함수명을 DataFrameGroupBy 객체의 agg() 내에 인자로 입력해서 사용\n",
" - agg() 내에 입력 값으로, '딕셔너리' 형태로 aggregation이 적용될 column들과 aggregation 함수를 입력"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:22.557403Z",
"start_time": "2020-05-21T06:01:22.526483Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"2\" halign=\"left\">B</th>\n",
" <th colspan=\"2\" halign=\"left\">C</th>\n",
" <th colspan=\"2\" halign=\"left\">D</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>max</th>\n",
" <th>min</th>\n",
" <th>max</th>\n",
" <th>min</th>\n",
" <th>max</th>\n",
" <th>min</th>\n",
" </tr>\n",
" <tr>\n",
" <th>A</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>bar</th>\n",
" <td>two</td>\n",
" <td>one</td>\n",
" <td>0.215592</td>\n",
" <td>-0.537435</td>\n",
" <td>0.628899</td>\n",
" <td>-0.538010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>foo</th>\n",
" <td>two</td>\n",
" <td>one</td>\n",
" <td>0.897209</td>\n",
" <td>-1.062168</td>\n",
" <td>1.753600</td>\n",
" <td>-2.013092</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" B C D \n",
" max min max min max min\n",
"A \n",
"bar two one 0.215592 -0.537435 0.628899 -0.538010\n",
"foo two one 0.897209 -1.062168 1.753600 -2.013092"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby(['A']).agg([max, min])"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:22.683782Z",
"start_time": "2020-05-21T06:01:22.671816Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" </tr>\n",
" <tr>\n",
" <th>A</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>bar</th>\n",
" <td>0.215592</td>\n",
" <td>-0.538010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>foo</th>\n",
" <td>0.897209</td>\n",
" <td>-2.013092</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" C D\n",
"A \n",
"bar 0.215592 -0.538010\n",
"foo 0.897209 -2.013092"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"agg_format = {'C':'max', 'D':'min'}\n",
"df.groupby(['A']).agg(agg_format)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 변형하기(Reshaping)\n",
"- 데이터 프레임을 다른 형태로 변환\n",
"- Reshaping 관련 참고 사이트: https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html#reshaping-stacking"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Stack 메소드\n",
"- 데이터 프레임의 column들을 index의 레벨로 만들며, 이를 '압축'한다고 표현한다"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:23.172003Z",
"start_time": "2020-05-21T06:01:23.152056Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" A B\n",
"first second \n",
"bar one -0.672399 -0.583972\n",
" two 0.656727 -0.070697\n",
"baz one 0.935536 -1.169262\n",
" two -0.413284 -0.813473\n"
]
},
{
"data": {
"text/plain": [
"first second \n",
"bar one A -0.672399\n",
" B -0.583972\n",
" two A 0.656727\n",
" B -0.070697\n",
"baz one A 0.935536\n",
" B -1.169262\n",
" two A -0.413284\n",
" B -0.813473\n",
"dtype: float64"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',\n",
" 'foo', 'foo', 'qux', 'qux'],\n",
" ['one', 'two', 'one', 'two',\n",
" 'one', 'two', 'one', 'two']]))\n",
"\n",
"index = pd.MultiIndex.from_tuples(tuples, names = ['first', 'second'])\n",
"df = pd.DataFrame(np.random.randn(8, 2), index = index, columns = ['A', 'B'])\n",
"df2 = df[:4]\n",
"print(df2)\n",
"\n",
"# stack 메소드를 통해 A와 B라는 값을 가지는 index 레벨이 하나 더 추가된 형태로 변환\n",
"stacked = df2.stack()\n",
"stacked"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:23.347693Z",
"start_time": "2020-05-21T06:01:23.334729Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" </tr>\n",
" <tr>\n",
" <th>first</th>\n",
" <th>second</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">bar</th>\n",
" <th>one</th>\n",
" <td>-0.672399</td>\n",
" <td>-0.583972</td>\n",
" </tr>\n",
" <tr>\n",
" <th>two</th>\n",
" <td>0.656727</td>\n",
" <td>-0.070697</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">baz</th>\n",
" <th>one</th>\n",
" <td>0.935536</td>\n",
" <td>-1.169262</td>\n",
" </tr>\n",
" <tr>\n",
" <th>two</th>\n",
" <td>-0.413284</td>\n",
" <td>-0.813473</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B\n",
"first second \n",
"bar one -0.672399 -0.583972\n",
" two 0.656727 -0.070697\n",
"baz one 0.935536 -1.169262\n",
" two -0.413284 -0.813473"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# stack 메소드를 통해 압축된 수준을 갖는 데이터 프레임을 다시 unstack 메소드로 원복시키기\n",
"# stack 메소드를 통해 압축되었던 마지막 수준부터 풀어주는 기능\n",
"stacked.unstack()"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:23.500643Z",
"start_time": "2020-05-21T06:01:23.486686Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>first</th>\n",
" <th>bar</th>\n",
" <th>baz</th>\n",
" </tr>\n",
" <tr>\n",
" <th>second</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">one</th>\n",
" <th>A</th>\n",
" <td>-0.672399</td>\n",
" <td>0.935536</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.583972</td>\n",
" <td>-1.169262</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">two</th>\n",
" <th>A</th>\n",
" <td>0.656727</td>\n",
" <td>-0.413284</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.070697</td>\n",
" <td>-0.813473</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"first bar baz\n",
"second \n",
"one A -0.672399 0.935536\n",
" B -0.583972 -1.169262\n",
"two A 0.656727 -0.413284\n",
" B -0.070697 -0.813473"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# unstack 메소드에서 '해제할 수준'을 지정해주기\n",
"\n",
"# 첫 번째 수준을 해제 --> bar와 baz라는 column이 생김\n",
"stacked.unstack(0)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:23.685278Z",
"start_time": "2020-05-21T06:01:23.668315Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>second</th>\n",
" <th>one</th>\n",
" <th>two</th>\n",
" </tr>\n",
" <tr>\n",
" <th>first</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">bar</th>\n",
" <th>A</th>\n",
" <td>-0.672399</td>\n",
" <td>0.656727</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.583972</td>\n",
" <td>-0.070697</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">baz</th>\n",
" <th>A</th>\n",
" <td>0.935536</td>\n",
" <td>-0.413284</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-1.169262</td>\n",
" <td>-0.813473</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"second one two\n",
"first \n",
"bar A -0.672399 0.656727\n",
" B -0.583972 -0.070697\n",
"baz A 0.935536 -0.413284\n",
" B -1.169262 -0.813473"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 두 번째 수준을 해제 --> one과 two라는 column이 생김\n",
"stacked.unstack(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Pivot Tables\n",
"- pivot_table(data, values = None, index = None, columns = None, aggfunc = 'mean', fill_value = None, margins = False, margins_name = 'All')\n",
" - data: 분석할 데이터 프레임 (메서드일 때는 필요하지 않음)\n",
" - values: 분석할 데이터 프레임에서 분석할 열\n",
" - index: 행 인덱스로 들어갈 키 열 또는 키 열의 리스트\n",
" - columns: 열 인덱스로 들어갈 키 열 또는 키 열의 리스트\n",
" - aggfunc: 분석 메서드 설정\n",
" - fill_value: NaN 대체 값 설정\n",
" - margins: 모든 데이터를 분석한 결과를 오른쪽과 아래에 붙일지 여부\n",
" - margins_name: 마진 열(행)의 이름\n",
"- Pivot Table 관련 참고 사이트: https://datascienceschool.net/view-notebook/76dcd63bba2c4959af15bec41b197e7c/"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:23.972010Z",
"start_time": "2020-05-21T06:01:23.961042Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"( A B C D E\n",
" 0 one A foo -0.447158 -0.016947\n",
" 1 one B foo -0.011032 -0.747219\n",
" 2 two C foo 0.160751 0.157437\n",
" 3 three A bar 1.808888 0.753999\n",
" 4 one B bar -0.003062 1.526580\n",
" 5 one C bar -1.231371 0.055387\n",
" 6 two A foo -0.433729 -1.438124\n",
" 7 three B foo -0.225208 1.376454\n",
" 8 one C foo -1.132540 -0.100790\n",
" 9 one A bar -0.692918 -0.311524\n",
" 10 two B bar -0.579238 -0.803641\n",
" 11 three C bar 0.344959 0.238237,)"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,\n",
" 'B': ['A', 'B', 'C'] * 4,\n",
" 'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,\n",
" 'D': np.random.randn(12),\n",
" 'E': np.random.randn(12)})\n",
"df, "
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:24.135336Z",
"start_time": "2020-05-21T06:01:24.109404Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>C</th>\n",
" <th>bar</th>\n",
" <th>foo</th>\n",
" </tr>\n",
" <tr>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">one</th>\n",
" <th>A</th>\n",
" <td>-0.692918</td>\n",
" <td>-0.447158</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.003062</td>\n",
" <td>-0.011032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C</th>\n",
" <td>-1.231371</td>\n",
" <td>-1.132540</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">three</th>\n",
" <th>A</th>\n",
" <td>1.808888</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>NaN</td>\n",
" <td>-0.225208</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C</th>\n",
" <td>0.344959</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">two</th>\n",
" <th>A</th>\n",
" <td>NaN</td>\n",
" <td>-0.433729</td>\n",
" </tr>\n",
" <tr>\n",
" <th>B</th>\n",
" <td>-0.579238</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C</th>\n",
" <td>NaN</td>\n",
" <td>0.160751</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"C bar foo\n",
"A B \n",
"one A -0.692918 -0.447158\n",
" B -0.003062 -0.011032\n",
" C -1.231371 -1.132540\n",
"three A 1.808888 NaN\n",
" B NaN -0.225208\n",
" C 0.344959 NaN\n",
"two A NaN -0.433729\n",
" B -0.579238 NaN\n",
" C NaN 0.160751"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 피벗 테이블 기능을 이용하여 위의 데이터 프레임을 변형\n",
"# 찾기 못한 값은 NaN 으로 표시\n",
"pd.pivot_table(df, values = 'D', index = ['A', 'B'], columns = ['C'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 시계열 데이터 다루기(Time Series)\n",
"- Pandas는 시계열 단위인 주기(frequency)를 다시 샘플링할 수 있다\n",
"- 특히 금융 데이터를 다룰 때 많이 사용한다\n",
"- Time Series 관련 참고 사이트: https://datascienceschool.net/view-notebook/8959673a97214e8fafdb159f254185e9/"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### pd.to_datetime() 함수\n",
"- 날짜/시간을 나타내는 문자열을 자동으로 datetime 자료형으로 바꾼 후, DatetimeIndex 자료형 index를 생성"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:24.555618Z",
"start_time": "2020-05-21T06:01:24.549633Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2018-01-01', '2018-01-04', '2018-01-05', '2018-01-06'], dtype='datetime64[ns]', freq=None)"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"date_str = [\"2018, 1, 1\", \"2018, 1, 4\", \"2018, 1, 5\", \"2018, 1, 6\"]\n",
"idx = pd.to_datetime(date_str)\n",
"idx"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:24.708900Z",
"start_time": "2020-05-21T06:01:24.698925Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-01 1.764052\n",
"2018-01-04 0.400157\n",
"2018-01-05 0.978738\n",
"2018-01-06 2.240893\n",
"dtype: float64"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 위에서 만들어진 index를 사용하여, Series나 DataFrame을 생성\n",
"np.random.seed(0)\n",
"s = pd.Series(np.random.randn(4), index = idx)\n",
"s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### pd.date_range() 함수\n",
"- 모든 날짜/시간을 일일히 입력할 필용없이, 시작일과 종료일 또는 시작일과 기간을 입력하면 범위 내의 index를 생성한다\n",
"- freq 인수로 특정한 날짜만 생성되도록 할 수도 있으며, 많이 사용되는 freq 인수값은 다음과 같다\n",
" - s: 초\n",
" - T: 분\n",
" - H: 시간\n",
" - D: 일(day)\n",
" - B: 주말이 아닌 평일\n",
" - W: 주(일요일)\n",
" - W-MON: 주(월요일)\n",
" - M: 각 달(month)의 마지막 날\n",
" - MS: 각 달의 첫날\n",
" - BM: 주말이 아닌 평일 중에서 각 달의 마지막 날\n",
" - BMS: 주말이 아닌 평일 중에서 각 달의 첫날\n",
" - WOM-2THU: 각 달의 두번째 목요일\n",
" - Q-JAN: 각 분기의 첫달의 마지막 날\n",
" - Q-DEC: 각 분기의 마지막 달의 마지막 날"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.034569Z",
"start_time": "2020-05-21T06:01:25.027592Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',\n",
" '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',\n",
" '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',\n",
" '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',\n",
" '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20',\n",
" '2018-04-21', '2018-04-22', '2018-04-23', '2018-04-24',\n",
" '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28',\n",
" '2018-04-29', '2018-04-30'],\n",
" dtype='datetime64[ns]', freq='D')"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.date_range(\"2018-4-1\", \"2018-4-30\")"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.183467Z",
"start_time": "2020-05-21T06:01:25.176521Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',\n",
" '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',\n",
" '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',\n",
" '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',\n",
" '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20',\n",
" '2018-04-21', '2018-04-22', '2018-04-23', '2018-04-24',\n",
" '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28',\n",
" '2018-04-29', '2018-04-30'],\n",
" dtype='datetime64[ns]', freq='D')"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.date_range(start = \"2018-4-1\", periods = 30)"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.368631Z",
"start_time": "2020-05-21T06:01:25.361653Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05',\n",
" '2018-04-06', '2018-04-09', '2018-04-10', '2018-04-11',\n",
" '2018-04-12', '2018-04-13', '2018-04-16', '2018-04-17',\n",
" '2018-04-18', '2018-04-19', '2018-04-20', '2018-04-23',\n",
" '2018-04-24', '2018-04-25', '2018-04-26', '2018-04-27',\n",
" '2018-04-30'],\n",
" dtype='datetime64[ns]', freq='B')"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.date_range(\"2018-4-1\", \"2018-4-30\", freq = \"B\") # freq=\"B\" 는 \"주말이 아닌 평일\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### shift 연산\n",
"- 시계열 데이터의 index는 시간이나 날짜를 나태나므로, 날짜 이동 등의 다양한 연산이 가능하다\n",
"- shift 연산을 사용하면, index는 그대로 두고 데이터만 이동할 수 있다"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.662270Z",
"start_time": "2020-05-21T06:01:25.653286Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-31 1.764052\n",
"2018-02-28 0.400157\n",
"2018-03-31 0.978738\n",
"2018-04-30 2.240893\n",
"Freq: M, dtype: float64"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.random.seed(0)\n",
"ts = pd.Series(np.random.randn(4), \n",
" index = pd.date_range(\"2018-1-1\", periods = 4, freq = \"M\")) # freq = \"M\" 는 \"각 달(month)의 마지막 날\"\n",
"ts"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.847953Z",
"start_time": "2020-05-21T06:01:25.837976Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-31 NaN\n",
"2018-02-28 1.764052\n",
"2018-03-31 0.400157\n",
"2018-04-30 0.978738\n",
"Freq: M, dtype: float64"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts.shift(1)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:25.994287Z",
"start_time": "2020-05-21T06:01:25.984311Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-31 0.400157\n",
"2018-02-28 0.978738\n",
"2018-03-31 2.240893\n",
"2018-04-30 NaN\n",
"Freq: M, dtype: float64"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# shift 인자로 '-1'을 입력하면, 맨 아래의 데이터를 기준으로 이동\n",
"ts.shift(-1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### resample 연산\n",
"- 시간 간격을 재조정하는 리샘플링이 가능\n",
"- 시간 구간이 작아지면 데이터 양이 증가한다 --> \"업-샘플링\"\n",
"- 시간 구간이 커지면 데이터 양이 감소한다 --> \"다운-샘플링\""
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:26.325538Z",
"start_time": "2020-05-21T06:01:26.316565Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-01 1.867558\n",
"2018-01-02 -0.977278\n",
"2018-01-03 0.950088\n",
"2018-01-04 -0.151357\n",
"2018-01-05 -0.103219\n",
"2018-01-06 0.410599\n",
"2018-01-07 0.144044\n",
"2018-01-08 1.454274\n",
"2018-01-09 0.761038\n",
"2018-01-10 0.121675\n",
"Freq: D, dtype: float64"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ts = pd.Series(np.random.randn(100), \n",
" index = pd.date_range(\"2018-1-1\", periods = 100, freq = \"D\"))\n",
"ts.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:26.482529Z",
"start_time": "2020-05-21T06:01:26.467536Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-07 0.305776\n",
"2018-01-14 0.629064\n",
"2018-01-21 -0.006910\n",
"2018-01-28 0.277065\n",
"2018-02-04 -0.144972\n",
"2018-02-11 -0.496299\n",
"2018-02-18 -0.474473\n",
"2018-02-25 -0.201222\n",
"2018-03-04 -0.775142\n",
"2018-03-11 0.052868\n",
"2018-03-18 -0.450379\n",
"2018-03-25 0.601892\n",
"2018-04-01 0.334893\n",
"2018-04-08 0.509605\n",
"2018-04-15 -0.150544\n",
"Freq: W-SUN, dtype: float64"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 다운-샘플링의 경우, 원래의 데이터가 그룹으로 묶이기 때문에\n",
"# groupby 때와 같이 그룹 연산을 해서 대표값을 구해야 한다\n",
"ts.resample('W').mean()"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:26.621250Z",
"start_time": "2020-05-21T06:01:26.611276Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2018-01-31 1.867558\n",
"2018-02-28 0.156349\n",
"2018-03-31 -1.726283\n",
"2018-04-30 0.356366\n",
"Freq: M, dtype: float64"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 달(month) 단위 구간 별로 각 column의 첫 번째 값(first value) 구하기\n",
"ts.resample('M').first()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 범주형 데이터 다루기(Categoricals)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:26.956093Z",
"start_time": "2020-05-21T06:01:26.943131Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>raw_grade</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>e</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id raw_grade\n",
"0 1 a\n",
"1 2 b\n",
"2 3 b\n",
"3 4 a\n",
"4 5 a\n",
"5 6 e"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({\"id\": [1, 2, 3, 4, 5, 6],\n",
" \"raw_grade\": ['a', 'b', 'b', 'a', 'a', 'e']})\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:27.139492Z",
"start_time": "2020-05-21T06:01:27.128523Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 a\n",
"1 b\n",
"2 b\n",
"3 a\n",
"4 a\n",
"5 e\n",
"Name: grade, dtype: category\n",
"Categories (3, object): [a, b, e]"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 단순한 문자로 되어있는 raw 데이터의 grade column을 범주형으로 변환\n",
"df['grade'] = df['raw_grade'].astype('category')\n",
"df['grade']"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:27.281582Z",
"start_time": "2020-05-21T06:01:27.273588Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 very good\n",
"1 good\n",
"2 good\n",
"3 very good\n",
"4 very good\n",
"5 very bad\n",
"Name: grade, dtype: category\n",
"Categories (3, object): [very good, good, very bad]"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 범주들의 이름을 원하는대로 바꿔주기\n",
"# Series.cat.categories 에 이름들을 할당\n",
"df['grade'].cat.categories = [\"very good\", \"good\", \"very bad\"]\n",
"df['grade']"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:27.430592Z",
"start_time": "2020-05-21T06:01:27.419676Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 very good\n",
"1 good\n",
"2 good\n",
"3 very good\n",
"4 very good\n",
"5 very bad\n",
"Name: grade, dtype: category\n",
"Categories (5, object): [very bad, bad, medium, good, very good]"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Series.cat 아래의 메소드들은 기본적으로 새로운 시리즈를 반환\n",
"df[\"grade\"] = df[\"grade\"].cat.set_categories([\"very bad\", \"bad\", \"medium\",\n",
" \"good\", \"very good\"])\n",
"\n",
"df[\"grade\"]"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:27.579325Z",
"start_time": "2020-05-21T06:01:27.567357Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>raw_grade</th>\n",
" <th>grade</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>e</td>\n",
" <td>very bad</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>b</td>\n",
" <td>good</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>b</td>\n",
" <td>good</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>a</td>\n",
" <td>very good</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>a</td>\n",
" <td>very good</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>a</td>\n",
" <td>very good</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id raw_grade grade\n",
"5 6 e very bad\n",
"1 2 b good\n",
"2 3 b good\n",
"0 1 a very good\n",
"3 4 a very good\n",
"4 5 a very good"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 범주의 순서를 정렬하기\n",
"\n",
"# 범주 이름의 어휘적 순서가 아닌, 범주에 이미 매겨진 값의 순서대로 정렬\n",
"# 즉, 범주형 자료를 만들거나 범주들을 재정의할 때 이루어진 순서가 범주에 매겨진 값이다\n",
"df.sort_values(by = 'grade')"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:27.699004Z",
"start_time": "2020-05-21T06:01:27.690056Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"grade\n",
"very bad 1\n",
"bad 0\n",
"medium 0\n",
"good 2\n",
"very good 3\n",
"dtype: int64"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 범주형 자료를 담고있는 column을 그룹으로 묶고, 각 범주에 해당하는 값의 빈도수 확인\n",
"# 이 과정을 통해 비어있는 범주가 무엇인지 알 수 있다\n",
"df.groupby('grade').size()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 그래프로 표현하기(Plotting)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### plot() 메소드"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:28.397747Z",
"start_time": "2020-05-21T06:01:28.118901Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x293d4e99788>"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ts = pd.Series(np.random.randn(1000), index = pd.date_range('1/1/2000', periods = 1000))\n",
"ts = ts.cumsum() # 누적 합계\n",
"ts.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**plot() 메소드를 사용하여 여러 개의 열을 한 번에 그릴 수 있다**"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"ExecuteTime": {
"end_time": "2020-05-21T06:01:28.740862Z",
"start_time": "2020-05-21T06:01:28.414735Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x293d5e43748>"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df = pd.DataFrame(np.random.randn(1000, 4), index = ts.index, columns = ['A', 'B', 'C', 'D'])\n",
"df = df.cumsum()\n",
"\n",
"# figure() 함수: matplotlib에서 figure를 만들고 편집할 수 있게 만들어주는 함수\n",
"plt.figure()\n",
"df.plot()\n",
"# loc = 'best'는 레전드의 위치를 자동으로 계산하여 최적의 위치에 레전드를 위치시킨다\n",
"plt.legend(loc = 'best')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 데이터 입/출력(Getting Data In/Out)\n",
"- Pandas는 데이터 파일을 읽어와서 데이터 프레임으로 만들 수 있다\n",
" - CSV\n",
" - Excel\n",
" - HTML\n",
" - JSON\n",
" - HDF5\n",
" - SAS\n",
" - STATA\n",
" - SQL\n",
"- 데이터 입/출력 관련 참고 사이트: \n",
" - 1. CSV 파일 입/출력: https://datascienceschool.net/view-notebook/c5ccddd6716042ee8be3e5436081778b/\n",
" - 2. Excel 파일 입/출력: https://rfriend.tistory.com/464"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CSV 파일 입력\n",
"- CSV 파일 포맷은 데이터 값이 쉼표(,)로 구분되는 텍스트 파일\n",
"- pd.read_csv('data.csv', names = None, index_col = None, sep = None, skiprows = None, na_values = None)\n",
" - names: 데이터 파일에 열 인덱스 정보가 없는 경우 --> ex) names = ['c1', 'c2', 'c3']\n",
" - index_col: 테이블 내의 특정한 열을 행 인덱스로 지정하고 싶은 경우 --> ex) index_col = 'c1'\n",
" - sep: 데이터를 구분하는 구분자가 쉼표(,)가 아닌 경우, sep 인수를 써서 구분자를 지정 --> ex) sep = '\\s+' => 구분자의 길이가 정해지지 않은 공백인 경우\n",
" - skiprows: 데이터 중에 건너 뛰어야 할 행이 있는 경우 --> ex) skiprows = [0, 1]\n",
" - na_values: 특정한 값을 NaN 으로 취급하고 싶은 경우 --> ex) na_values = ['누락']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CSV 파일 출력\n",
"- to_csv() 메소드를 사용\n",
" - ex) df.to_csv('data.csv', sep = None, na_rep = None, index = None, header = None)\n",
" - sep: 구분자 변경 --> ex) sep = '|'\n",
" - na_rep: NaN 으로 입력된 값을 변경 --> ex) na_rep = '누락'\n",
" - index: 인덱스 출력 여부 지정 --> ex) index = False\n",
" - header: 헤더 출력 여부 지정 --> ex) header = False"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Excel 파일 입/출력\n",
"- pd.read_excel('data.xlsx', ...)\n",
"- CSV 파일 입/출력과 거의 유사하다\n",
"- 위에 적어놓은 Excel 파일 입/출력 관련 사이트를 참고하자!!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment