포스트

[Python 100일 챌린지] Day 63 - Pandas 기초

[Python 100일 챌린지] Day 63 - Pandas 기초

데이터 분석의 핵심, Pandas! 🐼

엑셀처럼 데이터를 다루고 싶으신가요? Pandas를 쓰면 수백만 행 데이터도 코드 몇 줄로 분석할 수 있어요! 데이터 과학자, 분석가들의 필수 도구를 오늘 배워봅시다! 💪

(30분 완독 ⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 1: Pandas가 무엇인지 이해하기

한 줄 설명

Pandas = Python으로 엑셀 같은 표 데이터를 다루는 라이브러리 📊

1.1 Pandas가 필요한 이유

1
2
3
4
5
6
7
8
9
10
11
# ❌ 순수 Python으로 CSV 처리
data = []
with open('sales.csv', 'r') as f:
    for line in f:
        data.append(line.strip().split(','))
# 이후 복잡한 처리...

# ✅ Pandas로 CSV 처리
import pandas as pd
df = pd.read_csv('sales.csv')
print(df.head())  # 끝!

1.2 Pandas 설치하기

1
2
# Pandas 설치
pip install pandas

설치 확인:

1
python -c "import pandas as pd; print(f'Pandas {pd.__version__} 설치 완료!')"

1.3 Pandas의 두 가지 핵심 구조

1
2
3
4
import pandas as pd

# 1. Series: 1차원 데이터 (엑셀의 한 열)
# 2. DataFrame: 2차원 데이터 (엑셀 시트 전체)
graph LR
    A[Pandas] --> B[Series<br/>1차원]
    A --> C[DataFrame<br/>2차원]
    B --> D["[10, 20, 30]"]
    C --> E["이름 | 나이 | 점수<br/>철수 | 20 | 85<br/>영희 | 22 | 90"]

🎯 학습 목표 2: Series 다루기

2.1 Series 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd

# 리스트로 만들기
s1 = pd.Series([10, 20, 30, 40])
print(s1)
# 0    10
# 1    20
# 2    30
# 3    40
# dtype: int64

# 인덱스 지정하기
s2 = pd.Series([85, 90, 78, 92],
               index=['국어', '영어', '수학', '과학'])
print(s2)
# 국어    85
# 영어    90
# 수학    78
# 과학    92
# dtype: int64

# 딕셔너리로 만들기
data = {'서울': 9700000, '부산': 3400000, '인천': 2900000}
s3 = pd.Series(data)
print(s3)

2.2 Series 인덱싱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

scores = pd.Series([85, 90, 78, 92],
                   index=['국어', '영어', '수학', '과학'])

# 인덱스로 접근
print(scores['영어'])     # 90
print(scores[['국어', '수학']])  # 여러 개

# 숫자 위치로 접근
print(scores[0])          # 85
print(scores[1:3])        # 영어, 수학

# 조건 필터링
print(scores[scores >= 85])  # 85점 이상

2.3 Series 연산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd

s1 = pd.Series([10, 20, 30])
s2 = pd.Series([1, 2, 3])

# 기본 연산
print(s1 + s2)   # [11, 22, 33]
print(s1 * 2)    # [20, 40, 60]

# 통계 메서드
print(s1.sum())   # 60
print(s1.mean())  # 20.0
print(s1.max())   # 30
print(s1.min())   # 10

🎯 학습 목표 3: DataFrame 만들기

3.1 딕셔너리로 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd

# 가장 흔한 방법!
data = {
    '이름': ['철수', '영희', '민수', '지영'],
    '나이': [20, 22, 21, 23],
    '점수': [85, 90, 78, 92]
}

df = pd.DataFrame(data)
print(df)
#    이름  나이  점수
# 0  철수   20   85
# 1  영희   22   90
# 2  민수   21   78
# 3  지영   23   92

3.2 리스트로 만들기

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd

# 리스트의 리스트
data = [
    ['철수', 20, 85],
    ['영희', 22, 90],
    ['민수', 21, 78]
]

df = pd.DataFrame(data, columns=['이름', '나이', '점수'])
print(df)

3.3 인덱스 지정하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd

data = {
    '국어': [85, 90, 78],
    '영어': [90, 85, 92],
    '수학': [88, 78, 85]
}

df = pd.DataFrame(data, index=['철수', '영희', '민수'])
print(df)
#      국어  영어  수학
# 철수   85   90   88
# 영희   90   85   78
# 민수   78   92   85

3.4 NumPy 배열로 만들기

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

df = pd.DataFrame(arr,
                  columns=['A', 'B', 'C'],
                  index=['X', 'Y', 'Z'])
print(df)

🎯 학습 목표 4: DataFrame 기본 탐색하기

4.1 기본 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '나이': [20, 22, 21, 23, 20],
    '점수': [85, 90, 78, 92, 88],
    '학과': ['컴퓨터', '경영', '컴퓨터', '경영', '전자']
})

# 처음/끝 몇 행 보기
print(df.head())    # 처음 5행
print(df.head(3))   # 처음 3행
print(df.tail(2))   # 마지막 2행

# 크기 확인
print(df.shape)     # (5, 4) - 5행 4열

# 열 이름
print(df.columns)   # Index(['이름', '나이', '점수', '학과'], ...)

# 인덱스
print(df.index)     # RangeIndex(start=0, stop=5, step=1)

# 데이터 타입
print(df.dtypes)
# 이름    object
# 나이     int64
# 점수     int64
# 학과    object

4.2 info()와 describe()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '나이': [20, 22, 21, 23, 20],
    '점수': [85, 90, 78, 92, 88]
})

# 전체 정보 요약
print(df.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   이름      5 non-null      object
#  1   나이      5 non-null      int64
#  2   점수      5 non-null      int64

# 수치형 열의 통계 요약
print(df.describe())
#              나이        점수
# count   5.000000   5.000000
# mean   21.200000  86.600000
# std     1.303840   5.176872
# min    20.000000  78.000000
# 25%    20.000000  85.000000
# 50%    21.000000  88.000000
# 75%    22.000000  90.000000
# max    23.000000  92.000000

4.3 열 선택하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수'],
    '나이': [20, 22, 21],
    '점수': [85, 90, 78]
})

# 한 열 선택 (Series 반환)
print(df['이름'])
# 0    철수
# 1    영희
# 2    민수

# 여러 열 선택 (DataFrame 반환)
print(df[['이름', '점수']])
#    이름  점수
# 0  철수   85
# 1  영희   90
# 2  민수   78

# 점(.) 표기법 (열 이름이 영어일 때)
df2 = pd.DataFrame({'name': ['A', 'B'], 'age': [20, 30]})
print(df2.name)  # df2['name']과 동일

4.4 행 선택하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수'],
    '나이': [20, 22, 21],
    '점수': [85, 90, 78]
})

# loc: 라벨(이름) 기반
print(df.loc[0])      # 인덱스가 0인 행
print(df.loc[0:1])    # 인덱스 0~1 (1 포함!)

# iloc: 위치(숫자) 기반
print(df.iloc[0])     # 첫 번째 행
print(df.iloc[0:2])   # 0~1번째 행 (2 미포함)

# 특정 셀 선택
print(df.loc[0, '이름'])   # '철수'
print(df.iloc[0, 0])       # '철수'

💡 실전 팁 & 주의사항

✅ 좋은 습관

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd

# 1. pd로 임포트하기 (관례)
import pandas as pd  # ✅

# 2. 데이터 확인 습관
df = pd.read_csv('data.csv')
print(df.shape)      # 크기 확인
print(df.head())     # 내용 미리보기
print(df.info())     # 타입 확인
print(df.describe()) # 통계 확인

⚠️ loc vs iloc 차이

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3]
}, index=['x', 'y', 'z'])

# loc: 라벨 기반 (끝 포함)
print(df.loc['x':'y'])  # x, y 행

# iloc: 위치 기반 (끝 미포함)
print(df.iloc[0:2])     # 0, 1번째 행

🧪 연습 문제

문제 1: 학생 데이터 만들기

5명 학생의 이름, 나이, 국어, 영어, 수학 점수가 담긴 DataFrame을 만들고, 각 과목의 평균을 출력하세요.

💡 힌트
  • pd.DataFrame(dict) 형태로 생성
  • df['열이름'].mean() 또는 df.mean()
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '나이': [20, 22, 21, 23, 20],
    '국어': [85, 90, 78, 92, 88],
    '영어': [90, 85, 92, 88, 95],
    '수학': [78, 88, 85, 90, 82]
})

print(df)
print("\n=== 과목별 평균 ===")
print(f"국어 평균: {df['국어'].mean():.1f}")
print(f"영어 평균: {df['영어'].mean():.1f}")
print(f"수학 평균: {df['수학'].mean():.1f}")

문제 2: 조건에 맞는 데이터 찾기

위 DataFrame에서 국어 점수가 85점 이상인 학생들만 출력하세요.

💡 힌트
  • df[df['열이름'] >= 값] 형태로 필터링
정답 코드
1
2
3
4
5
6
7
8
9
10
import pandas as pd

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '국어': [85, 90, 78, 92, 88]
})

# 국어 85점 이상
high_scorers = df[df['국어'] >= 85]
print(high_scorers)

📝 오늘 배운 내용 정리

  1. Pandas = Python 데이터 분석 핵심 라이브러리
  2. Series: 1차원 데이터 (인덱스 + 값)
  3. DataFrame: 2차원 데이터 (엑셀 시트처럼)
  4. 기본 탐색: head(), info(), describe(), shape
  5. 선택: 열은 df['열'], 행은 df.loc[], df.iloc[]

🔗 관련 자료


📚 이전 학습

Day 62: NumPy 활용 ⭐⭐

어제는 NumPy 인덱싱, 슬라이싱, 브로드캐스팅을 배웠어요!

📚 다음 학습

Day 64: Pandas 데이터 로딩 ⭐⭐

내일은 CSV, Excel 파일을 읽고 쓰는 방법을 배워요!


“Pandas를 배우면 데이터 분석이 재미있어져요!” 🐼

Day 63/100 Phase 7: 데이터 분석 기초 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.