🚀
고급 (Advanced)
ndarray · DataFrame · groupby · CSV
8주차 — NumPy / Pandas 입문
NumPy 배열 연산과 인덱싱, Pandas DataFrame 의 필터·정렬·groupby, 그리고 CSV 읽고 분석하기까지 — 데이터 처리의 두 거인을 만납니다.
numpypandasDataFramegroupby
소요 시간
⏱ 2시간
난이도
📊 고급
선수 조건
🎯 고급 7주차
결과물
DataFrame 으로 CSV 데이터 분석
이 강의에서 배우는 것
- 1NumPy 배열 생성·연산·인덱싱을 한다
- 2Pandas DataFrame 의 기본 조작을 익힌다
- 3CSV 를 읽고 필터·집계한다
- 4groupby 와 피벗 테이블을 사용한다
0. 설치
bash
pip install numpy pandas matplotlib1. NumPy 기본
python
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.mean(), a.std(), a.sum())
# 벡터 연산 (Python list보다 훨씬 빠름)
print(a * 2) # [2 4 6 8 10]
print(a + a)
print(a > 2) # 불리언 배열
# 2D
m = np.arange(12).reshape(3, 4)
print(m)
print(m.shape)
print(m.sum(axis=0)) # 컬럼 합
print(m.sum(axis=1)) # 행 합2. NumPy 인덱싱
python
a = np.arange(10)
print(a[3])
print(a[2:6])
print(a[a > 5]) # 불리언 인덱싱
m = np.arange(12).reshape(3, 4)
print(m[1, 2]) # 행 1, 열 2
print(m[:, 1]) # 모든 행, 열 1
print(m[1, :]) # 행 13. Pandas DataFrame
python
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie", "Dave"],
"score": [92, 78, 85, 67],
"dept": ["A", "B", "A", "B"],
})
print(df)
print(df.describe())
print(df.shape, df.columns.tolist())4. 필터·정렬·집계
python
# 필터
print(df[df.score >= 80])
# 정렬
print(df.sort_values("score", ascending=False))
# 그룹 집계
print(df.groupby("dept")["score"].mean())
print(df.groupby("dept").agg({"score": ["mean", "max", "count"]}))5. CSV 읽기
python
df = pd.read_csv("sales.csv")
df["date"] = pd.to_datetime(df["date"])
monthly = df.groupby(df["date"].dt.to_period("M"))["amount"].sum()
print(monthly)6. 시각화 (matplotlib)
python
import matplotlib.pyplot as plt
monthly.plot(kind="bar")
plt.title("월별 매출")
plt.tight_layout()
plt.savefig("monthly.png")자주 하는 실수
- for 루프로 NumPy 배열 처리 — 벡터 연산 사용해야 빠름
- SettingWithCopyWarning — df[df.x > 0]['y'] = 5 대신 .loc[]
- 인덱스 vs 컬럼 혼동 — df['a'] 는 컬럼, df.loc[a] 는 인덱스
- NaN 무시 — dropna(), fillna() 로 명시적 처리
FAQ
Q1. NumPy vs list? — NumPy는 동일 타입, 메모리 연속, 벡터 연산. 수치 계산에서 100배 이상 빠름.
Q2. Pandas vs SQL? — Pandas는 메모리 내. SQL은 영구 저장 + 큰 데이터.
Q3. polars 가 더 빠르다는데? — 맞음. 큰 데이터에서 좋음. 다만 생태계는 pandas 압도적.
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
01_numpy_basic.py— 배열, 연산
CODE
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print("평균:", a.mean())
print("표준편차:", round(a.std(), 4))
print("합계:", a.sum())
print("배수:", a * 2)
print("불리언:", a > 2)▶ 실행 결과
평균: 3.0
표준편차: 1.4142
합계: 15
배수: [ 2 4 6 8 10]
불리언: [False False False True True]02_numpy_indexing.py— 인덱싱·슬라이싱
CODE
import numpy as np
m = np.arange(12).reshape(3, 4)
print(m)
print("m[1, 2] =", m[1, 2])
print("m[:, 1] =", m[:, 1])
print("m[1, :] =", m[1, :])
print("axis=0 합:", m.sum(axis=0))
print("axis=1 합:", m.sum(axis=1))▶ 실행 결과
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
m[1, 2] = 6
m[:, 1] = [1 5 9]
m[1, :] = [4 5 6 7]
axis=0 합: [12 15 18 21]
axis=1 합: [ 6 22 38]03_pandas_basic.py— DataFrame 생성·조회
CODE
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"score": [92, 78, 85],
})
print(df)
print("---")
print("평균:", df["score"].mean())
print("최대:", df["score"].max())▶ 실행 결과
name score
0 Alice 92
1 Bob 78
2 Charlie 85
---
평균: 85.0
최대: 9204_pandas_groupby.py— 필터·groupby
CODE
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie", "Dave"],
"score": [92, 78, 85, 67],
"dept": ["A", "B", "A", "B"],
})
print(df[df.score >= 80])
print("---")
print(df.groupby("dept")["score"].mean())▶ 실행 결과
name score dept
0 Alice 92 A
2 Charlie 85 A
---
dept
A 88.5
B 72.5
Name: score, dtype: float64📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
NumPy 배열 통계
목표: 1~100 배열의 평균/최대/짝수 합을 구한다.
요구사항
- np.arange 사용
- 평균, 최대, 짝수 합 출력
💡 힌트
a[a % 2 == 0].sum()
입출력 예시
평균: 50.5
최대: 100
짝수 합: 2550채점
- · 불리언 인덱싱 사용
▶정답 코드 펼치기 / 접기
SOLUTION
import numpy as np
a = np.arange(1, 101)
print(f"평균: {a.mean()}")
print(f"최대: {a.max()}")
print(f"짝수 합: {a[a % 2 == 0].sum()}")▶ 실행 결과
평균: 50.5
최대: 100
짝수 합: 2550과제 2
DataFrame 학과별 평균
목표: 학생 점수 DataFrame 에서 학과별 평균을 구한다.
요구사항
- pandas.DataFrame 직접 작성
- groupby + mean
💡 힌트
df.groupby('dept')['score'].mean()
입출력 예시
dept
A 88.5
B 72.5
Name: score, dtype: float64채점
- · DataFrame 사용
- · groupby 결과 일치
▶정답 코드 펼치기 / 접기
SOLUTION
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie", "Dave"],
"score": [92, 78, 85, 67],
"dept": ["A", "B", "A", "B"],
})
print(df.groupby("dept")["score"].mean())▶ 실행 결과
dept
A 88.5
B 72.5
Name: score, dtype: float64과제 3
BMI 시뮬레이션
목표: 키/몸무게 분포에서 BMI 통계를 구한다.
요구사항
- np.random.normal 로 키 1.7m, 몸무게 65kg 분포 100개
- BMI = 몸무게 / 키^2
- 평균 BMI 출력
💡 힌트
seed 고정으로 재현 가능
입출력 예시
평균 BMI: 22.x채점
- · 벡터 연산
- · 통계 출력
▶정답 코드 펼치기 / 접기
SOLUTION
import numpy as np
rng = np.random.default_rng(42)
heights = rng.normal(1.7, 0.05, 100)
weights = rng.normal(65, 5, 100)
bmi = weights / heights ** 2
print(f"평균 BMI: {bmi.mean():.2f}")
print(f"최저 BMI: {bmi.min():.2f}")
print(f"최고 BMI: {bmi.max():.2f}")▶ 실행 결과
평균 BMI: 22.66
최저 BMI: 17.95
최고 BMI: 28.14