풀스택 백엔드 2026.07.16

syyu21b·2026년 7월 16일

풀스택 - 백엔드

목록 보기
45/49
post-thumbnail

[SECTION 11. 파이썬 기초 문법 - 모듈]

1. 모듈

  • 모듈(Module): 파이썬 코드(변수, 함수, 클래스)를 담은 파일(.py)
  • 다른 파일에서 불러와 사용할 수 있습니다.
  • import 모듈명 으로 가져옵니다.

예제 1: 직접 만든 모듈 사용

# math_utils.py 파일 내용
def add(a, b):
    return a + b

def mul(a, b):
    return a * b

# main.py 파일 내용
import math_utils

print("3 + 5 =", math_utils.add(3, 5))
print("4 * 6 =", math_utils.mul(4, 6))

예제 2: 모듈 별칭(alias)와 from-import

# 모듈 별칭 사용
import math_utils as mu
print("별칭 사용:", mu.add(10, 20))

# 특정 함수만 가져오기
from math_utils import mul
print("함수 직접 import:", mul(3, 7))

문제 : 모듈 import 방식 이해하기

  • 다음은 math_utils.py 모듈의 일부입니다.
    # math_utils.py
    def add(a, b):
        return a + b
    
    def mul(a, b):
        return a * b
  • 아래의 main.py 코드가 올바르게 작동하도록 빈칸을 채우세요.
    # main.py
    __________ math_utils as mu
    __________ math_utils import add
    
    print(__________.mul(2, 5))     # 결과: 10
    print(__________(7, 3))        # 결과: 10
    
    # 정답 코드
    
    # main.py
    import math_utils as mu
    from math_utils import add
    
    print(mu.mul(2, 5))     # 결과: 10
    print(add(7, 3))    # 결과: 10

from-import 방식 주의할 점

1) 이름 충돌(name conflict)

from 모듈명 import 함수명 방식은

모듈 이름 없이 바로 함수 이름을 사용합니다.

그래서 같은 이름의 함수나 변수가 현재 파일에 있을 경우 덮어쓰기(overwrite) 될 수 있습니다.

from math_utils import add

def add(a, b):
    return a - b   # 기존 add()를 덮어씀!

print(add(3, 5))  # 결과: -2  ← math_utils.add() 아님

✅ 해결 방법:

  • 별칭(alias) 사용: from math_utils import add as add_func
  • 또는 import math_utils 형태로 네임 스페이스를 유지

2) 코드 가독성 저하

어떤 함수가 어디서 왔는지 한눈에 알기 어렵습니다.

특히 여러 모듈에서 from ... import ...를 동시에 사용하면

코드의 출처가 불분명해져 유지 보수가 어려워집니다.

from math_utils import add
from string_utils import add  # 나중에 누가 덮어썼는지 헷갈림

✅ 해결 방법:

  • 모듈이 많을 땐 import 모듈명 또는 import 모듈명 as 별칭 사용

3) * import는 비추천

from math_utils import *

이렇게 쓰면 모든 함수와 변수가 현재 네임 스페이스로 들어오므로 예상치 못한 이름 충돌이 쉽게 발생합니다.

from math_utils import *
from string_utils import *  # 어떤 add가 사용되는지 모름

✅ 해결 방법:

필요한 것만 명시적으로 가져오기

from math_utils import add, mul

정리 요약

문제점설명권장 해결법
이름 충돌동일한 이름이 덮어 쓰기 될 수 있음별칭(as) 사용
출처 불명확코드 가독성 저하import 모듈명 사용
* 사용예측 불가한 충돌필요한 함수만 선택적으로 import

2. 표준 모듈

  • 파이썬은 다양한 표준 라이브러리 모듈을 제공합니다.
  • 예: math, random, datetime

예제 1: math 모듈

import math

print("제곱근:", math.sqrt(16))
print("원주율:", math.pi)
print("삼각함수:", math.sin(math.radians(90)))
print("올림:", math.ceil(3.2))
print("내림:", math.floor(3.8))

예제 2: random 모듈

import random

print("랜덤 정수:", random.randint(1, 10))
print("랜덤 실수:", random.uniform(0, 1))

items = ["사과", "배", "포도"]
print("랜덤 선택:", random.choice(items))

random.shuffle(items)
print("섞기:", items)

예제 3: datetime 모듈

from datetime import datetime, timedelta

# 현재 날짜와 시간
now = datetime.now()
print("현재 시각:", now)

# 날짜 포맷 변경
print("형식 지정:", now.strftime("%Y-%m-%d %H:%M:%S"))

# 일주일 후 날짜 계산
next_week = now + timedelta(days=7)
print("일주일 후:", next_week.strftime("%Y-%m-%d"))

# 특정 날짜 만들기
birthday = datetime(2025, 7, 15)
print("지정 날짜:", birthday.strftime("%Y-%m-%d"))

# 두 날짜 차이 계산
diff = birthday - now
print("생일까지 남은 일수:", diff.days, "일")

3. 외부 모듈

  • 파이썬 표준 모듈 외에도 외부 패키지를 설치해서 사용할 수 있습니다.
  • 설치: pip install 모듈명
  • 예: requests, numpy, pandas

예제 1: requests 모듈

import requests

response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
print("상태 코드:", response.status_code)
print("JSON 데이터:", response.json())

예제 2: numpy 모듈

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print("배열:", arr)
print("합계:", np.sum(arr))
print("평균:", np.mean(arr))
print("제곱:", np.square(arr))

예제 3: tabulate 모듈

from tabulate import tabulate

data = [
    ["Alice", 90, 85, 92],
    ["Bob", 75, 80, 70],
    ["Charlie", 88, 90, 85]
]

headers = ["이름", "국어", "영어", "수학"]

print(tabulate(data, headers=headers))

[SECTION 12. 파이썬 기초 문법 - 넘파이 (Numpy)]

1. NumPy

  • 정의: 'Numerical Python'의 약자로, 대규모 다차원 배열과 행렬 연산을 지원하는 라이브러리입니다.
  • 핵심: 배열(ndarray)이라는 단일 데이터 타입을 사용하여 계산 속도가 압도적으로 빠릅니다.

NumPy가 필요한 이유

  1. 압도적 속도: 일반 리스트보다 수백 배 빠릅니다.
  2. 수학적 기능: 행렬 계산, 통계 데이터 처리가 매우 쉽습니다.
  3. AI의 기본: 머신러닝 모델(Scikit-learn)이나 딥러닝(TensorFlow/PyTorch)은 내부적으로 모두 넘파이 배열로 데이터를 주고받습니다.
lst = [1, 2, 3, 4, 5]
data_set = {1,1,1,1,1,1,2,3,3,4,4,5}
data_dict = {"name" : "김수한"}

print(type(lst))
print(type(data_set))
print(type(data_dict))
import numpy as np

lst1 = [1, 2, 3, 4]
lst2 = [5, 6, 7, 8]

print("=== list와 for문 이용 ===")
for i in range(len(lst1)):
    print(lst1[i] + lst2[i], end=" ")

arr1 = np.array(lst1)
arr2 = np.array(lst2)

print()
print("=== 넘파이 이용 ===")
print("arr1 + arr2:", arr1 + arr2)
print("arr1 * 2", arr1 * 2)
import numpy as np
import time

# 1. 속도 비교를 위해 대용량 데이터 준비 (100만 개의 데이터)
DATA_SIZE = 1_000_000
lst1 = list(range(DATA_SIZE))
lst2 = list(range(DATA_SIZE))

arr1 = np.array(lst1)
arr2 = np.array(lst2)

# 2. 리스트와 for문을 이용한 더하기 연산 측정
print("=== 파이썬 list와 for문 연산 시작 ===")
start_time = time.time()

# 리스트 컴프리헨션을 사용하여 각 요소를 더합니다.
list_result = [lst1[i] + lst2[i] for i in range(len(lst1))]

end_time = time.time()
list_duration = end_time - start_time
print(f"List 연산 소요 시간: {list_duration:.6f}초")

print("\n=== 넘파이(NumPy) 벡터화 연산 시작 ===")
# 3. 넘파이 배열을 이용한 더하기 연산 측정
start_time = time.time()

arr_result = arr1 + arr2

end_time = time.time()
arr_duration = end_time - start_time
print(f"NumPy 연산 소요 시간: {arr_duration:.6f}초")

# 4. 결과 및 배율 출력
print("\n=== 성능 비교 결과 ===")
if arr_duration > 0:
    speed_ratio = list_duration / arr_duration
    print(f"NumPy ndarray 연산이 파이썬 List보다 약 {speed_ratio:.1f}배 빠릅니다.")
else:
    print("NumPy 연산이 너무 순식간에 끝나 측정 불가 수준입니다.")

2. NumPy 라이브러리 불러오기 (Import)

  • 파이썬에서 외부 도구를 가져올 때는 import를 사용합니다. 넘파이는 전 세계적으로 np라는 별명을 사용하는 것이 약속입니다.
    import numpy as np

3-1. 메소드(생성, 정보, 변형)

  • NumPy 사용 시 생성, 정보, 변형을 위한 주요 메소드와 속성입니다.
    분류명령어사용 예시
    생성np.array()기존 리스트를 넘파이 배열로 바꿀 때
    np.arange()0, 1, 2... 처럼 연속된 숫자 배열을 만들 때
    np.zeros() / np.ones()데이터를 넣기 전, 0이나 1로 빈 그릇을 준비할 때
    정보arr.shape이 배열이 몇 행 몇 열인지 확인할 때
    arr.ndim이 데이터가 1차원(선)인지 2차원(면)인지 궁금할 때
    arr.dtype담긴 숫자가 정수(int)인지 실수(float)인지 확인할 때
    변형arr.reshape()1줄로 된 데이터를 2행 3열 등으로 모양을 바꿀 때
    import numpy as np
    
    # 1. 리스트를 넘파이 배열로 변환 (np.array)
    data = [1, 2, 3, 4, 5]
    arr = np.array(data)
    print("1. 생성된 배열:", arr)
    
    # 2. 배열의 '정체' 확인하기 (정보 메소드)
    print(" - 모양(shape):", arr.shape) # (5,) -> 5개의 요소가 있는 1차원
    print(" - 차원(ndim):", arr.ndim)   # 1 -> 선 형태의 1차원 데이터
    print(" - 타입(dtype):", arr.dtype) # int64 -> 정수들이 담겨 있습닏.
    
    # 3. 연속된 숫자 만들기 (np.arange)
    # 0부터 시작해서 10 '전'까지 숫자를 생성
    seq_arr = np.arange(10)
    print("\n2. 0부터 9까지:", seq_arr)
    import numpy as np
    
    # 4. 12개의 숫자를 만듭니다 (0~11)
    base = np.arange(12)
    print("5. 변신 전(1차원):", base)
    
    # 5. 3행 4열로 모양 바꾸기 (reshape)
    # 주의! 전체 개수가 12개니까 3x4=12, 딱 맞아야 합니다.
    transformed = base.reshape(3, 4)
    print("\n6. 변신 후(2차원):\n", transformed)
    
    # 6. 바뀐 후의 정보 확인
    print(" - 바뀐 모양:", transformed.shape) # (3, 4)
    print(" - 바뀐 차원:", transformed.ndim)  # 2차원(면)이 생성됩니다.

3-2. 메소드(통계, 수학 연산)

  • NumPy 사용 시 통계 및 수학 연산을 위한 주요 메소드입니다.
    분류사용 예시 (코드)사용 예시
    통계 연산np.sum(arr, axis=0)배열 요소의 전체 합계 출력 시
    np.mean(arr)배열의 산술 평균 계산 시
    np.max(arr) / np.min(arr)배열 내 최댓값 또는 최솟값 찾을 때
    np.argmax(arr)최댓값/최솟값이 위치한 인덱스(번호) 반환 시
    형태 변경arr.reshape(2, 3)데이터를 유지하며 지정한 차원(행, 열)으로 변경 시
    arr.T행과 열을 서로 바꿀 때
    arr.flatten()다차원 배열을 1차원 배열로 변경 시
    조건/검색np.where(arr > 5, 1, 0)조건이 참이면 1, 거짓이면 0으로 변환 시
    np.sort(arr)배열의 요소를 오름차순으로 정렬 시
    np.unique(arr)중복된 값을 제거하고 고유한 값들만 추출 시
    배열 생성np.arange(0, 10, 2)시작부터 끝까지 간격(step)에 맞춰 숫자 생성 시
    np.linspace(0, 1, 5)시작~끝 범위를 균등하게 5등분하여 생성 시
    np.random.rand(2, 2)0~1 사이의 랜덤한 실수로 채워진 배열 생성 시
    import numpy as np
    
    # 1. 생성: 60점부터 95점까지 5점 간격으로 점수 생성 (arange)
    scores = np.arange(60, 100, 5)
    print("1. 생성된 점수들:", scores)
    
    # 2. 변형: 8개의 데이터를 4행 2열(4명 학생의 국어, 영어 점수)로 변환 (reshape)
    score_table = scores.reshape(4, 2)
    print("\n2. 성적 표(4행 2열):\n", score_table)
    
    # 3. 변형: 행과 열 바꾸기 (T)
    print("\n3. 과목별로 보기:\n", score_table.T)
    
    # 4. 생성: 0~1 사이의 랜덤 점수 가산점 생성 (random.rand)
    plus_score = np.random.rand(4, 2)
    print("\n4. 랜덤 가산점:\n", plus_score)
    # 5. 통계: 전체 평균 점수 (mean) 
    print(f"5. 전체 평균: {np.mean(score_table):.2f}")
     
    # 6. 통계: 과목별 합계 (sum, axis=0) - 세로 방향 합계
    print("6. 과목별 총점(국, 영):", np.sum(score_table, axis=0))
    
    # 7. 통계: 최고점 찾기 (max, argmax)
    print("7. 최고 점수:", np.max(score_table))
    print("   최고 점수가 있는 위치(인덱스):", np.argmax(score_table))
    # 8. 조건: 80점 이상인 점수는 'Pass', 아니면 'Fail' (where)
    # 연습을 위해 1(Pass)과 0(Fail)으로 표시해 봅시다.
    pass_fail = np.where(score_table >= 80, 1, 0)
    print("8. 80점 이상 합격 표시(1:합격):\n", pass_fail)
    
    # 9. 검색: 중복 제거 (unique)
    # 가상의 중복 데이터 배열을 만들어 확인해 봅시다.
    duplicate_data = np.array([1, 2, 2, 3, 3, 3])
    print("\n9. 중복 제거 전:", duplicate_data)
    print("   중복 제거 후(고유값):", np.unique(duplicate_data))
    
    # 10. 정렬: 점수 낮은 순으로 정렬 (sort)
    # score_table을 1차원으로 펴서(flatten) 정렬해 봅시다.
    flat_scores = score_table.flatten()
    print("\n10. 펼쳐진 점수:", flat_scores)
    print("    정렬된 점수:", np.sort(flat_scores))

4. 왜 리스트 대신 NumPy를 쓰나요?

  1. 병렬 연산: 반복문(for) 없이 배열 전체에 한 번에 연산을 수행합니다.
  2. 메모리 효율: 리스트보다 적은 메모리를 사용하며 대용량 데이터를 처리합니다.
  3. 행렬 연산: 인공지능 모델이 수식을 계산할 때 필수적인 행렬 곱셈 등을 지원합니다.

5. 연습 문제

Q1. 여러분은 이번 주 우리 동네의 일교차를 확인하려고 합니다. 아래 조건에 맞게 코드를 작성해 보세요.

  • 넘파이 배열 temps에 월요일부터 일요일까지의 최고 기온인 [22, 25, 28, 23, 26, 29, 27]을 담으세요.
  • 이 기온 데이터의 전체 평균을 구하여 출력하세요.
  • 이번 주 기온 중 가장 높았던 온도(최댓값)가 몇 도인지 출력하세요.
import numpy as np

lst = [22, 25, 28, 23, 26, 29, 27]
temp = np.array(lst)

print(f"평균 기온: {np.mean(temp):.1f}도")
print(f"최고 기온: {np.max(temp)}도")

Q2. 두 명의 학생이 각각 국어, 영어, 수학 시험을 보았습니다. 넘파이를 이용해 과목별 평균을 구해봅시다.

  • 아래 형태의 2행 3열의 넘파이 배열 grades를 만드세요.
    • 학생 A: 80점, 90점, 70점 # 1행
    • 학생 B: 85점, 95점, 80점 # 2행
  • axis를 이용하여 각 과목별 평균을 구하세요. (결과는 국어, 영어, 수학 순으로 3개가 나와야 합니다.)
  • grades 배열의 모양(shape)이 어떻게 되는지 출력해 보세요.
import numpy as np

# - 학생 A: 80점, 90점, 70점 # 1행
# - 학생 B: 85점, 95점, 80점 # 2행

lst = [80, 90 ,70, 85, 95, 80]

grades = np.array(lst).reshape(2, 3)
print("=== 과목별 평균 ===")
print(f"국어 평균: {np.mean(grades, axis= 0)[0]}점")
print(f"영어 평균: {np.mean(grades, axis= 0)[1]}점")
print(f"수학 평균: {np.mean(grades, axis= 0)[2]}점")

print("=== 배열의 모양 ===")
print(grades.shape)

[SECTION 12. 파이썬 기초 문법 - Pandas 기초]

1. Pandas

  • 정의: 파이썬에서 데이터 분석을 쉽고 빠르게 할 수 있도록 도와주는 필수 라이브러리입니다.
  • 핵심: 데이터를 Series(1차원)와 DataFrame(2차원 / 표 형태)이라는 구조에 담아 자유자재로 요리합니다.

왜 Pandas인가요? (AICE 시험 필수 이유)

  1. 대용량 데이터: 엑셀이 멈추는 대용량 데이터도 순식간에 처리합니다.
  2. 전처리 최적화: 결측치 처리, 데이터 정렬, 필터링을 코드 한 줄로 끝냅니다.
  3. AICE 시험에서의 비중: 대부분의 문제는 Pandas 데이터 프레임을 활용 능력에 달려 있습니다.

2. Pandas 핵심 구조

  • Pandas는 두 가지만 기억하시면 됩니다. 바로 ‘시리즈(Series)’‘데이터프레임(DataFrame)’입니다.

명칭형태설명비유
Series (시리즈)1차원엑셀의 열(Column) 하나세로 한 줄
DataFrame (데이터프레임)2차원엑셀의 시트(Table) 전체행과 열이 있는 표

3. Series 메소드 & 속성

  • Pandas 중 Series 사용 시 사용되는 주요 메소드와 속성입니다.

3-1. 수치 연산 및 통계

메소드기능
s.sum()요소들의 합계를 계산합니다.
s.mean()산술 평균을 계산합니다.
s.median()중앙값을 찾습니다.
s.std()표준편차를 계산합니다.
s.min() / s.max()최소값과 최대값을 찾습니다.
s.idxmin() / s.idxmax()최소값 또는 최대값을 가진 인덱스를 반환합니다.
s.value_counts()고유한 값들의 빈도수(개수)를 계산하여 내림차순 정렬합니다.
s.unique()중복을 제거한 고유한 값들을 배열로 반환합니다.
s.nunique()고유한 값의 개수를 반환합니다.

3-2. 데이터 선택 및 슬라이싱

속성설명예시
.loc라벨(Label) 기반 인덱싱. 인덱스의 이름을 직접 지정합니다.s.loc['a']
.iloc정수 위치(Integer position) 기반 인덱싱. 0부터 시작하는 순서를 지정합니다.s.iloc[0]
.atloc와 비슷하지만, 단 하나의 값만 빠르게 가져올 때 사용합니다.s.at['a']
.iatiloc와 비슷하지만, 단 하나의 값만 위치 기반으로 빠르게 가져올 때 사용합니다.s.iat[0]

4. Series 예제

  • Series를 사용할 수 있도록 Pandas를 import하고 활용해 봅시다.

예제 4-1. Pandas 불러오기 및 Series 생성

import pandas as pd

# 리스트를 활용한 시리즈 생성 (학생들의 성적 데이터 예시)
data = [85, 90, 78, 92, 88]
index = ['Student_A', 'Student_B', 'Student_C', 'Student_D', 'Student_E']

scores = pd.Series(data, index)
print(scores)
import pandas as pd

# 리스트를 활용한 시리즈 생성 (학생들의 성적 데이터 예시)
데이터 = [85, 90, 78, 92, 88]
이름표 = ['Student_A', 'Student_B', 'Student_C', 'Student_D', 'Student_E']

scores = pd.Series(data=데이터, index=이름표)
print(scores)
정수 위치 (iloc)인덱스 이름 (loc)데이터 값 (Value)
0'Student_A'85
1'Student_B'90
2'Student_C'78
3'Student_D'92
4'Student_E'88

예제 4-2. 수치 연산 및 통계

# 1. 주요 통계치 확인
print("평균 점수:", scores.mean())
print("최고 점수:", scores.max())
print("점수 표준편차:", scores.std())

# 2. 요약 통계량 (시험에서 데이터 분포 파악 시 필수 사용)
print("\n--- 전체 요약 ---")
print(scores.describe())

# 3. 응용: 특정 점수 이상인 데이터만 연산 (조건부 연산)
# 90점 이상인 학생들의 점수 합계
high_scores_sum = scores[scores >= 90].sum()
print(f"\n90점 이상 학생 점수 합계: {high_scores_sum}")

예제 4-3. 데이터 선택 및 슬라이싱

# 1. loc (레이블 이름 기반 선택)
# Student_B의 점수 추출
student_b_score = scores.loc['Student_B']
print(f"Student_B의 점수: {student_b_score}")

# 2. iloc (정수 위치 기반 슬라이싱)
# 첫 번째부터 세 번째 학생까지 추출 (인덱스 0, 1, 2)
top_three = scores.iloc[0:3]
print("\n--- 상위 3명 데이터 ---")
print(top_three)

# 3. 값 변경 (데이터 수정)
# Student_C의 점수를 78점에서 80점으로 수정
scores.loc['Student_C'] = 80
print("\n--- 점수 수정 후 Student_C ---")
print(scores.loc['Student_C'])

# 4. 불리언 인덱싱 (조건 선택 - AICE 실기 단골 유형)
# 평균 점수보다 낮은 학생들만 필터링
under_mean = scores[scores < scores.mean()]
print("\n--- 평균 미달 학생 목록 ---")
print(under_mean)

예제 4-4. 조건에 맞는 데이터 필터링

  • 실제 시험에서는 "특정 기준(평균, 특정 수치 등)을 넘는 데이터만 추출하라"는 지시가 나옵니다.
  • 다음은 한 주간의 일일 배송 건수 데이터입니다. 평균 배송 건수보다 많이 배송한 날들의 데이터만 추출하세요.
import pandas as pd

# 1. 데이터 생성 (요일별 배송 건수)
delivery = pd.Series([120, 150, 90, 200, 170], 
                     index=['월', '화', '수', '목', '금'])

# 2. 평균 계산
avg_delivery = delivery.mean()

# 3. 평균보다 큰 데이터만 필터링 (AICE 대비 핵심 스킬)
target_days = delivery[delivery > avg_delivery]

print(f"평균 배송 건수: {avg_delivery}")
print("--- 평균 이상 배송한 날 ---")
print(target_days)

예제 4-5. 이름(Label)과 번호(Position)로 데이터 추출

  • 데이터를 인덱스 이름으로 접근할지, 순서 번호로 접근할지 정확히 아는 것이 중요합니다.
  • 환자 ID별 혈당 수치 데이터입니다. 'P02' 환자의 수치를 확인하고, 앞에서부터 3명의 데이터만 슬라이싱하세요.
import pandas as pd

# 1. 데이터 생성 (환자 ID별 혈당)
sugar_levels = pd.Series([95, 110, 125, 105, 98], 
                         index=['P01', 'P02', 'P03', 'P04', 'P05'])

# 2. 특정 이름(Label)으로 접근
p02_level = sugar_levels['P02']

# 3. 위치 번호(Position)로 슬라이싱 (앞에서 3명)
top_3 = sugar_levels[0:3]

print(f"환자 P02의 혈당: {p02_level}")
print("--- 상위 3명 데이터 ---")
print(top_3)

5. DataFrame 메소드 & 속성

  • Pandas 중 DataFrame 사용 시 사용되는 주요 메소드와 속성입니다.

5-1. 데이터 확인 및 탐색 (Inspection)

메소드기능
df.head(n)상위 n개 행 보기 (기본 5개)
df.tail(n)하위 n개 행 보기
df.info()컬럼명, 데이터 타입, 결측치 확인
df.describe()수치 데이터의 통계값(평균, 최소값 등)
df.shape행과 열의 개수 반환 (변수)

5-2. 데이터 가공 및 정렬 (Manipulation)

메소드기능
df.sort_values()특정 컬럼 기준으로 정렬
df.drop()특정 행이나 열 삭제
df.value_counts()특정 컬럼의 값별 개수 세기
df.astype()데이터 타입 변경 (예: 문자 -> 숫자)

6. DataFrame 예제

  • 딕셔너리를 DataFrame을 이용하여 표 형태로 변환하고, 데이터를 선택해 봅시다.

예제 4-1. 딕셔너리를 표로 변환

import pandas as pd  # Pandas를 불러오고 'pd'라는 별명으로 부릅니다.

# 1. 딕셔너리를 이용해 데이터프레임 만들기
data = {
    '이름': ['Java', 'Bami', 'Choco', 'Cookie'],
    '나이': [3, 2, 5, 1],
    '종류': ['White', 'Black', 'Cheese', 'Grey'],
    '점수': [90, 85, 70, 95]
}

df = pd.DataFrame(data)

# 2. 데이터 확인하기
print("--- 상위 2개 데이터 확인 ---")
display(df.head(2)) # head()는 위에서부터 데이터를 보여줍니다.

print("\n--- 데이터 요약 정보 ---")
df.info() # 데이터의 개수와 타입을 한눈에 보여줍니다.

print("\n--- 통계 정보 ---")
display(df.describe()) # 숫자 데이터의 평균, 최소값 등을 보여줍니다.
import pandas as pd

data = {
    '이름': ['Java', 'Bami', 'Choco', 'Cookie'],
    '나이': [3, 2, 5, 1],
    '종류': ['White', 'Black', 'Cheese', 'Grey'],
    '점수': [90, 85, 70, 95]
}

df = pd.DataFrame(data)
print(df.describe())
print(df['점수'].mean())
print(df['나이'].max())

print("======== 데이터 프레임 출력 ===========")
print()
print()
print()
print(df)
(Index)이름나이종류점수
0Java3White90
1Bami2Black85
2Choco5Cheese70
3Cookie1Grey95

예제 4-2. 데이터 선택(Selection) 실습

import pandas as pd

# 1. 실습용 데이터프레임 생성
data = {
    '이름': ['김철수', '이영희', '박민수', '최지우'],
    '나이': [22, 25, 21, 28],
    '성적': [85, 92, 78, 95],
    '합격여부': [True, True, False, True]
}
df = pd.DataFrame(data)

# 2. 열(Column) 선택: 특정 '과목'이나 '특성'만 뽑기
# 결과는 Series(시리즈) 형태로 나옵니다.
names = df['이름']
print("--- [열 선택] 이름 컬럼만 출력 ---")
print(names)

# 3. 행(Row) 선택 (.loc): 특정 '사람'의 정보만 뽑기
# 인덱스 이름(여기서는 0, 1, 2...)을 기준으로 가져 옵니다.
first_person = df.loc[0]
print("\n--- [행 선택] 첫 번째 행(김철수) 정보 ---")
print(first_person)

# 4. 조건 필터링: 특정 '기준'에 맞는 데이터만 뽑기 ⭐⭐⭐
# 성적이 90점 이상인 데이터만 추출합니다.
top_students = df[df['성적'] >= 90]
print("\n--- [필터링] 성적 90점 이상인 학생 ---")
print(top_students)

예제 4-3. 행렬 실습

  • 먼저 실습을 위해 조금 더 풍성한 성적표 데이터를 준비합시다.
import pandas as pd

# 1. 처음엔 기본 인덱스 (0, 1, 2)
df = pd.DataFrame({'값': [10, 20, 30]})

# 2. 인덱스 이름을 ["첫 번째", "두 번째", "세 번째"]로 변경
df.index = ["첫 번째", "두 번째", "세 번째"]

print(df)
#          값
# 첫 번째   10
# 두 번째   20
# 세 번째   30

# --- 값 바꾸기 시도 ---

# [loc] 이름을 써야 함
df.loc["첫 번째"] = 100 # (O)

# [iloc] 이름이 바뀌었어도 번호를 써야 함
df.iloc[0] = 500       # (O)
import pandas as pd

data = {
    '이름': ['Kim', 'Lee', 'Park', 'Choi', 'Jung'],
    '국어': [80, 95, 78, 92, 85],
    '영어': [88, 92, 85, 90, 82],
    '수학': [85, 100, 80, 95, 88],
    '코딩': [100, 85, 90, 80, 95]
}

df = pd.DataFrame(data)
# 이름을 인덱스로 설정하면 loc 연습하기가 훨씬 좋습니다!
df = df.set_index('이름')

print("--- 원본 데이터프레임 ---")
print(df)
이름 (loc)국어 (Col)영어 (Col)수학 (Col)코딩 (Col)
Kim808885100
Lee959210085
Park78858090
Choi92909580
Jung85828895
  • 특정 학생의 특정 과목 점수 하나만 딱 집어내는 연습입니다.
  • 미션 1: 'Park'의 '수학' 점수를 loc로 가져오기
  • 미션 2: 1행 1열(Lee의 국어) 점수를 iloc로 가져오기
print(df.loc['Park', '수학'])  # 이름과 과목으로 콕!
print(df.iloc[1, 0])           # 번호로 콕! (Lee는 1번 행, 국어는 0번 열)
  • 엑셀에서 범위를 드래그하듯 여러 행과 열을 한꺼번에 가져오는 방법입니다.
  • 미션 3: 'Lee'부터 'Choi'까지, '국어'부터 '영어'까지 (2x2 행렬) 가져오기 (loc)
  • 미션 4: 맨 앞 2행과 맨 앞 2열만 가져오기 (iloc)
# loc 슬라이싱은 마지막 이름(Choi, 영어)을 포함합니다!
print(df.loc['Lee':'Choi', '국어':'영어'])

# iloc 슬라이싱은 파이썬 리스트처럼 마지막 번호를 포함하지 않습니다!
print(df.iloc[0:2, 0:2])
  • 연속되지 않은 특정 행과 열만 골라서 새로운 행렬을 만드는 방법입니다.
  • 미션 5: 'Kim'과 'Jung'의 '수학'과 '코딩' 점수만 뽑기 (loc)
  • 미션 6: 0번, 2번 행의 1번, 3번 열 뽑기 (iloc)
# 리스트를 대괄호 [] 안에 한 번 더 넣어줍니다!
print(df.loc[['Kim', 'Jung'], ['수학', '코딩']])
print(df.iloc[[0, 2], [1, 3]])

7. 연습 문제

Q1. 다음은 어느 과일 가게의 5일간 사과 판매량 데이터입니다. 아래 지시사항에 따라 코드를 작성하세요.

  • 주어진 리스트 sales_data와 인덱스 days를 사용하여 Series를 생성하세요.
  • 생성한 Series에서 평균 판매량보다 많이 팔린 날의 데이터만 추출하여 출력하세요.
import pandas as pd

sales_data = [15, 20, 12, 25, 18]
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']

# 여기에 코드를 작성하세요.
  • 정답
    import pandas as pd
    
    sales_data = [15, 20, 12, 25, 18]
    days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
    
    # 여기에 코드를 작성하세요.
    
    s = pd.Series(data=sales_data, index=days)
    
    avg = s.mean() # 평균
    result = s[s >= avg]
    print("=== 평균 판매량보다 많이 판매된 날 ===")
    print(result)

Q2. 다음은 학생들의 정보를 담은 데이터입니다. 아래 지시사항에 따라 코드를 작성하세요.

  • 주어진 딕셔너리 data를 사용하여 df라는 이름의 DataFrame을 생성하세요.

  • 'Math' 컬럼만 선택하여 출력하세요.

  • 수학 점수(Math)가 90점 이상인 학생의 'Name'과 'Math' 정보만 출력하세요.

  • 정답

import pandas as pd

data = {
    'Name': ['Kim', 'Lee', 'Park', 'Choi'],
	    'Age': [20, 21, 22, 20],
    'Math': [85, 95, 78, 92]
}

df = pd.DataFrame(data)

print("=== 수학 열만 출력 ===")
print(df['Math'])

print("=== 수학 점수가 90 이상인 학생의 정보 ===")
#             조건                   가져올 컬럼
print(df.loc[df['Math'] >= 90, ['Name', 'Math']])

0개의 댓글