{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 03wk-2: Pandas – 행과 열의 선택\n", "\n", "최규빈 \n", "2023-09-20\n", "\n", "\n", "\n", "# 1. 강의영상\n", "\n", "\n", "\n", "# 2. Imports" ], "id": "62cb8e67-f5e2-452b-a265-6289fe2a17aa" }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ], "id": "375347eb-711c-4ea9-b378-5e2dfe264711" }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. Pandas: 행과 열의 선택\n", "\n", "`-` 두 가지 형태의 데이터프레임" ], "id": "549186c2-075e-4b77-9726-06844b5099cf" }, { "cell_type": "code", "execution_count": 247, "metadata": {}, "outputs": [], "source": [ "dct = {'date': ['12/30','12/31','01/01','01/02','01/03'], 'X1': [65,95,65,55,80], 'X2': [55,100,90,80,30], 'X3': [50,50,60,75,30], 'X4': [40,80,30,80,100]}\n", "df = pd.DataFrame(dct) \n", "df" ], "id": "b81c7e25-24db-43d0-ac7b-e12166997d60" }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [], "source": [ "ts = pd.DataFrame({'X1': [65,95,65,55,80], 'X2': [55,100,90,80,30], 'X3': [50,50,60,75,30], 'X4': [40,80,30,80,100]}, index=['12/30','12/31','01/01','01/02','01/03']) \n", "ts" ], "id": "2d8272b7-9c5b-404a-93f2-85b5206cb98e" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A. 열의 선택\n", "\n", "`-` 방법1: `df.?` + str" ], "id": "982f9964-f471-4725-8842-38f4fed8771a" }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "# df.X1" ], "id": "0224d28d-f15f-463c-8134-ebb336ab120b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 방법2: `df[?]` + str, \\[str,str\\]" ], "id": "a2467431-7338-4eb7-952e-578b88784989" }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "# df['X1'] # str \n", "# df[['X1']] # [str]\n", "# df[['X1','X3']] # [str,str]" ], "id": "d0ad5943-3235-4143-aa19-244c98dc02a9" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 방법3: `df.iloc[:,?]` + int, int:int, \\[int,int\\], \\[bool,bool\\],\n", "range" ], "id": "b6f5e632-0798-496a-8424-fa2924df29ac" }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "# df.iloc[:,0] # int\n", "# df.iloc[:,-2:] # int:int - 슬라이싱\n", "# df.iloc[:,1::2] # int:int - 스트라이딩\n", "# df.iloc[:,[0]] # [int]\n", "# df.iloc[:,[0,1]] # [int,int]\n", "# df.iloc[:,[True,True,False,False]] # bool의 list \n", "# df.iloc[:,range(2)] # range" ], "id": "f493c75b-6c44-47cf-b2f6-da138b2395f2" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 방법4: `df.loc[:,?]` + str, ‘str:str’, \\[str,str\\], \\[bool,bool\\]" ], "id": "0e8bd910-7359-4a4a-8ec7-e263e15d8e80" }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "# df.loc[:,'X1'] # str\n", "# df.loc[:,'X1':'X3'] # 'str':'str' -- 칼럼이름으로 슬라이싱 **\n", "# df.loc[:,'X1'::2] # 'str':'str' -- 칼럼이름으로 스트라이딩 ** \n", "# df.loc[:,['X1']] # [str]\n", "# df.loc[:,['X1','X4']] # [str,str]\n", "# df.loc[:,[True,False,False,True]] # bool의 list" ], "id": "d3ad3793-49dd-4feb-9e44-9e19aaa73063" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## B. 행의 선택\n", "\n", "`-` 방법1: `df[]` + int:int, str:str, \\[bool,bool\\],\n", "pd.Series(\\[bool,bool\\]) – $(\\star\\star\\star\\star\\star)$" ], "id": "7c0e9b6c-79df-4acf-9f5b-25a1a1863cee" }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [], "source": [ "# df[:2] # int:int -- 슬라이싱 // df.iloc[:2,:], df.iloc[:2] 와 같음\n", "# df[::2] # int:int -- 스트라이딩 \n", "# ts['12/30':'01/02'] # str:str -- 슬라이싱\n", "# ts['12/31'::2] # str:str -- 스트라이딩\n", "# df[['12' in date for date in df.date]] # [bool,bool]\n", "# df[df.X1 < 70] # pd.Series([bool,bool])" ], "id": "72dea6ce-94ba-42e8-bcb3-7349a44b036d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 방법2: `df.iloc[]`, `df.iloc[,:]` + int, int:int, \\[int,int\\],\n", "\\[bool,bool\\], range" ], "id": "361ea6d0-28d8-4f53-a912-30fa858b8de3" }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "# df.iloc[0] # int \n", "# df.iloc[-2:] # int:int -- 슬라이싱\n", "# df.iloc[1::2] # int:int -- 스트라이딩\n", "# df.iloc[[0]] # [int]\n", "# df.iloc[[0,1]] # [int,int]\n", "# df.iloc[['12' in date for date in df.date]] # [bool,bool]\n", "# df.iloc[range(2)] # range" ], "id": "aa8d0591-47b3-49aa-8f98-3b79c6a4f421" }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "# df.iloc[0,:] # int \n", "# df.iloc[-2:,:] # int:int -- 슬라이싱\n", "# df.iloc[1::2,:] # int:int -- 스트라이딩\n", "# df.iloc[[0],:] # [int]\n", "# df.iloc[[0,1],:] # [int,int]\n", "# df.iloc[['12' in date for date in df.date],:] # [bool,bool]\n", "# df.iloc[range(2),:] # range" ], "id": "9d0431db-a36e-479e-9279-ffb95efa2598" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 방법3: `df.loc[]`, `df.loc[,:]` + int, str, int:int, str:str,\n", "\\[int,int\\], \\[str,str\\], \\[bool,bool\\], pd.Series(\\[bool,bool\\])" ], "id": "834f3315-2f97-41cf-8512-55977ea7f518" }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [], "source": [ "# df.loc[0] # int \n", "# ts.loc['12/30'] # str \n", "# df.loc[:2] # int:int \n", "# ts.loc[:'01/02'] # str:str \n", "# df.loc[[0,1]] # [int,int]\n", "# ts.loc[['12/30','01/01']] # [str,str]\n", "# df.loc[['12' in date for date in df.date]] # [bool,bool]\n", "# df.loc[df.X1>70] # pd.Series([bool,bool]) " ], "id": "01784be1-00e4-4a58-84e7-b838db95e47a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## D. 제 스타일\n", "\n", "`-` **가장 안전한 코드**" ], "id": "ca04331a-7b99-4fe2-b0c5-aaa5f6ddd870" }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "# df.loc[:,:]" ], "id": "1215c5c0-6c51-4cf7-a80c-75d9cfd8928c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황1: 하나의 col을 뽑으려 할때 좋은 코드" ], "id": "44d71c73-dd41-47c3-83ce-1c979e537c48" }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [], "source": [ "# df.X1 # 최애 \n", "# df['X1'] # 차애 \n", "# df[['X1']] # 차애" ], "id": "09b5640d-e68f-4e85-a765-66f93af9a3de" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황2: row 슬라이싱을 할때 좋은 코드 $(\\star\\star\\star)$" ], "id": "89f10868-937a-4e8b-b3a9-df1ece6166b1" }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [], "source": [ "# df[:5] # 최애 \n", "# ts[:'01/02'] # 시계열인 경우 " ], "id": "a9159d23-6461-4225-b272-0aacf7bee7c0" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황3: 조건에 맞는 row를 뽑을때 좋은 코드" ], "id": "702720fe-f5a8-4125-a8d0-33d819cb87ea" }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [], "source": [ "# df[df.X1<60] # 최애\n", "# df.loc[['12' in date for date in df.date]] # 차애" ], "id": "fc5cd214-d952-419a-b995-fd33663b51c6" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황4: 하나의 row를 뽑으려 할때 좋은 코드" ], "id": "caabeea7-48f9-420c-b116-693585acdd1e" }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [], "source": [ "# df.iloc[0] # 최애 \n", "# df.loc[0] # 차애" ], "id": "13f2455f-c8e6-4ce5-9df2-839d4cdb3de9" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황5: (row,col)을 뽑으려 할때 좋은 코드" ], "id": "ebf2d92c-62da-4993-a9f2-011aeb093cd9" }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [], "source": [ "# 최애: pd.Series를 뽑고 -> 인덱스로접근\n", "# df.X1[0]\n", "# df['X1'][0]\n", "\n", "# 차애: iloc, loc 으로 한번에 뽑기\n", "# df.iloc[0,0]\n", "# df.loc[0,'X1']" ], "id": "ee1cfd8e-9bb5-4d2b-abc6-d5d4ad12aa4b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "***위의 상황이외에는 `df.loc[:,:]`를 사용하는것이 유리하다***\n", "\n", "`-` 상황6: column 슬라이싱을 할때" ], "id": "44adafe0-f942-4988-a215-53a44a7ae34d" }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [], "source": [ "# df.loc[:,'X1':'X3'] # 끝점포함" ], "id": "08404928-66d1-4802-8aa1-baca2f903d7a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황7: row + column 슬라이싱을 하는 가장 좋은 코드" ], "id": "c4b678a1-96fc-4c15-9b84-aab1ad6b4816" }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [], "source": [ "df.loc[::2,'X1':'X2']" ], "id": "ac14d521-c3c8-4cc9-be8e-23fc1dedd807" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황8: 조건에 맞는 col을 뽑기에 가장 좋은 코드" ], "id": "49d131d1-3358-4eb1-8b10-be9baf0b981e" }, { "cell_type": "code", "execution_count": 162, "metadata": {}, "outputs": [], "source": [ "# df.loc[:,[len(colname)>2 for colname in df.columns]]" ], "id": "64469888-a760-4eb7-8c7d-decaf7903eb5" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 상황9: 조건에 맞는 row, col을 뽑기에 가장 좋은 코드" ], "id": "68b08835-e0c7-47dd-abf6-072ad03226ac" }, { "cell_type": "code", "execution_count": 171, "metadata": {}, "outputs": [], "source": [ "# df.loc[df.X1>70,[len(colname)>2 for colname in df.columns]]" ], "id": "04ecba3c-a46e-431d-934f-b8253aa2ba1b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## D. 제 스타일 X\n", "\n", "`-` 제가 안쓰는 코드1" ], "id": "62ebefb0-ccaf-498e-922d-fc295b1bda01" }, { "cell_type": "code", "execution_count": 172, "metadata": {}, "outputs": [], "source": [ "df[:1]" ], "id": "e1c4956d-8445-4df4-98e5-0daa4907a5bd" }, { "cell_type": "markdown", "metadata": {}, "source": [ "이러면 내 입장에서는 마치 아래가 동작할 것 같잖아.." ], "id": "498476f5-2d00-46ac-b314-6218589e5a3a" }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [], "source": [ "df[0] " ], "id": "ccb705f9-3471-4c3d-84bd-68db7a55fa64" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 제가 안쓰는 코드2: bool의 list를 사용할때 iloc은 가급적 쓰지마세요" ], "id": "bd43c352-3492-4292-a266-b78c0d1e6877" }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [], "source": [ "df.iloc[list(df['X1']<80),:]" ], "id": "7cf9e49c-b783-4439-a216-842a1f3a0f6c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "이러면 마치 아래도 동작할 것 같잖아.." ], "id": "58adbdb0-1881-4d8b-b268-87b923c4334a" }, { "cell_type": "code", "execution_count": 177, "metadata": {}, "outputs": [], "source": [ "df.iloc[df['X1']<80,:]" ], "id": "ff3d0fc0-e998-4b15-afed-80663dad9aed" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## E. 요약\n", "\n", "`-` 알아두면 좋은 규칙\n", "\n", "- `.iloc[]` 와 `.iloc[,:]`는 완전히 동등하다.\n", "- `.loc[]` 와 `.loc[,:]`는 완전히 동등하다.\n", "- 결과를 `pd.Series` 형태가 아닌 `pd.DataFrame` 형태로 얻고 싶다면\n", " `[[?]]`를 사용하면 된다.\n", "\n", "`-` 정리\n", "\n", "### ROW\n", "\n", "| type of indexer | `.` | `[]` | `.iloc` | `.loc` | 내가 쓴다면? |\n", "|:--------------------------:|:-----:|:------:|:---------:|:----------:|:---------:|\n", "| int | X | X | O | $\\Delta$ | `df.iloc[3,:]` |\n", "| int:int | X | O | O | $\\Delta$ | `df[3:5]` |\n", "| \\[int,int\\] | X | X | O | $\\Delta$ | `df.iloc[idx,:]` |\n", "| str | X | X | X | O | `ts.loc['time1',:]` |\n", "| str:str | X | O | X | O | `ts.loc['time1':'time2',:]` |\n", "| \\[str,str\\] | X | X | X | O | 안할 듯 |\n", "| \\[bool,bool\\] | X | O | O | O | `df[filtered_idx]` |\n", "| pd.Series(\\[bool,bool\\]) | X | O | X | O | `df[df.X1>20]` |\n", "\n", "### COL\n", "\n", "| type of indexer | `.` | `[]` | `.iloc` | `.loc` | 내가 쓴다면? |\n", "|:---------------:|:---:|:----:|:-------:|:------:|:------------------------:|\n", "| int | X | X | O | X | `df.iloc[:,0]` |\n", "| int:int | X | X | O | X | `df.iloc[:,0:2]` |\n", "| \\[int,int\\] | X | X | O | X | `df.iloc[:,idx]` |\n", "| str | O | O | X | O | `df.loc[:,'X1']` |\n", "| str:str | X | X | X | O | `df.loc[:,'X1':'X4']` |\n", "| \\[str,str\\] | X | O | X | O | `df.loc[:,colname_list]` |\n", "| \\[bool,bool\\] | X | X | O | O | `df.loc[:,bool_list]` |\n", "\n", "# 4. HW\n", "\n", "아래와 같은 데이터프레임이 있다고 하자." ], "id": "aa3335db-ea7e-4b5d-81e7-e23903298c86" }, { "cell_type": "code", "execution_count": 233, "metadata": {}, "outputs": [], "source": [ "df=pd.read_csv('https://raw.githubusercontent.com/PacktPublishing/Pandas-Cookbook/master/data/movie.csv')\n", "df" ], "id": "d83cad64-7e82-49c9-86b8-f724d69f8740" }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 데이터프레임의 columns은 아래와 같다." ], "id": "3fe14f5b-9438-47b6-aed4-9b039c11510a" }, { "cell_type": "code", "execution_count": 235, "metadata": {}, "outputs": [], "source": [ "df.columns" ], "id": "420a74af-66c7-44d1-90d8-dfd2a595f0f9" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`actor` 라는 단어가 포함된 column만을 선택하는 코드를 작성하라." ], "id": "f393de5c-87fe-4a9a-a7a0-dbc1327f9ab8" }, { "cell_type": "code", "execution_count": 238, "metadata": {}, "outputs": [], "source": [ "# 출력결과는 아래와 같다. " ], "id": "798e6364-39db-4d7f-b470-68b81dff0bf8" }, { "cell_type": "markdown", "metadata": {}, "source": [ "------------------------------------------------------------------------\n", "\n", "**hint: 아래는 column 이름이 5글자 이하인 열을 출력하는 코드를 작성한\n", "것이다.**" ], "id": "741b7f8d-fb9c-44bd-9c67-5d2428e526ec" }, { "cell_type": "code", "execution_count": 244, "metadata": {}, "outputs": [], "source": [ "df.loc[:,[len(col_name)<=5 for col_name in df.columns]]" ], "id": "e98b9c92-0030-4cc4-921b-3790054d4eb7" }, { "cell_type": "markdown", "metadata": {}, "source": [ "**note:** `[len(col_name)<=5 for col_name in df.columns]` 와 같은\n", "컴프리헨션 문법이 익숙하지 않다면\n", "\n", "- \n", "\n", "의 리스트컴프리헨션을 복습할 것" ], "id": "99c2c0c8-80ad-42c1-b8ba-78ed0f666fe9" } ], "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3 (ipykernel)", "language": "python" }, "language_info": { "name": "python", "codemirror_mode": { "name": "ipython", "version": "3" }, "file_extension": ".py", "mimetype": "text/x-python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } } }