{
"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"
}
}
}