포스트

[Python 100일 챌린지] Day 65 - Pandas 데이터 조작

[Python 100일 챌린지] Day 65 - Pandas 데이터 조작

데이터를 자유자재로 다뤄봅시다! 🔧

필터링, 정렬, 열 추가/삭제… 실무에서 매일 쓰는 데이터 조작 기법을 배워요! 이것만 알면 웬만한 데이터 전처리는 가능합니다! 💪

(30분 완독 ⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 1: 데이터 필터링하기

1.1 조건으로 필터링

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

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

# 단일 조건
high_score = df[df['점수'] >= 85]
print(high_score)

# 여러 조건 (AND)
result = df[(df['점수'] >= 85) & (df['나이'] >= 21)]
print(result)

# 여러 조건 (OR)
result = df[(df['학과'] == '컴퓨터') | (df['학과'] == '경영')]
print(result)

1.2 isin()으로 필터링

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

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '학과': ['컴퓨터', '경영', '컴퓨터', '경영', '전자']
})

# 특정 값들 중 하나와 일치하는 행
result = df[df['학과'].isin(['컴퓨터', '전자'])]
print(result)

# 포함되지 않는 행
result = df[~df['학과'].isin(['경영'])]
print(result)

1.3 문자열 조건

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

df = pd.DataFrame({
    '이름': ['김철수', '이영희', '박민수', '김지영', '최현수'],
    '이메일': ['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]']
})

# 특정 문자 포함
result = df[df['이름'].str.contains('')]
print(result)

# 특정 문자로 시작
result = df[df['이메일'].str.startswith('kim')]
print(result)

# 특정 문자로 끝남
result = df[df['이메일'].str.endswith('.com')]
print(result)

1.4 query() 메서드

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

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

# SQL 스타일 쿼리
result = df.query('점수 >= 85')
result = df.query('나이 >= 21 and 점수 >= 80')
result = df.query('이름 == "철수"')
print(result)

🎯 학습 목표 2: 데이터 정렬하기

2.1 단일 열 정렬

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

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

# 오름차순 정렬
sorted_df = df.sort_values('점수')
print(sorted_df)

# 내림차순 정렬
sorted_df = df.sort_values('점수', ascending=False)
print(sorted_df)

2.2 여러 열 정렬

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

df = pd.DataFrame({
    '학과': ['컴퓨터', '경영', '컴퓨터', '경영'],
    '이름': ['철수', '영희', '민수', '지영'],
    '점수': [85, 90, 78, 92]
})

# 학과로 먼저 정렬, 같으면 점수로 정렬
sorted_df = df.sort_values(['학과', '점수'], ascending=[True, False])
print(sorted_df)

2.3 인덱스 정렬

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

df = pd.DataFrame({
    'A': [3, 1, 2]
}, index=['c', 'a', 'b'])

# 인덱스 기준 정렬
sorted_df = df.sort_index()
print(sorted_df)

🎯 학습 목표 3: 열 추가/수정/삭제하기

3.1 열 추가

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

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

# 새 열 추가 (계산)
df['총점'] = df['국어'] + df['영어']
df['평균'] = df['총점'] / 2

# 조건에 따른 값
df['합격'] = df['평균'] >= 80

print(df)

3.2 열 수정

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

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

# 전체 열 수정
df['점수'] = df['점수'] + 5  # 전체 5점 추가

# 조건부 수정
df.loc[df['점수'] < 80, '점수'] = 80  # 80점 미만은 80점으로

print(df)

3.3 열 삭제

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

df = pd.DataFrame({
    '이름': ['철수', '영희'],
    '나이': [20, 22],
    '점수': [85, 90],
    '임시': [1, 2]
})

# 열 삭제
df = df.drop('임시', axis=1)
# 또는
df = df.drop(columns=['임시'])

# 여러 열 삭제
df = df.drop(columns=['나이', '점수'])

print(df)

3.4 열 이름 변경

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

df = pd.DataFrame({
    'name': ['철수', '영희'],
    'age': [20, 22]
})

# 이름 변경
df = df.rename(columns={'name': '이름', 'age': '나이'})
print(df)

# 전체 열 이름 변경
df.columns = ['이름', '나이']

🎯 학습 목표 4: 결측값 처리하기

4.1 결측값 확인

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

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

# 결측값 확인
print(df.isnull())       # True/False 표시
print(df.isnull().sum()) # 열별 결측값 개수
print(df.isnull().sum().sum())  # 전체 결측값 개수

4.2 결측값 삭제

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

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

# 결측값이 있는 행 삭제
df_cleaned = df.dropna()
print(df_cleaned)

# 특정 열에 결측값이 있는 행만 삭제
df_cleaned = df.dropna(subset=['이름'])

# 모든 값이 결측인 행만 삭제
df_cleaned = df.dropna(how='all')

4.3 결측값 채우기

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

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수'],
    '점수': [85, np.nan, 78]
})

# 특정 값으로 채우기
df_filled = df.fillna(0)

# 평균으로 채우기
df_filled = df.fillna(df['점수'].mean())

# 앞의 값으로 채우기 (forward fill)
df_filled = df.fillna(method='ffill')

# 뒤의 값으로 채우기 (backward fill)
df_filled = df.fillna(method='bfill')

print(df_filled)

💡 실전 팁

✅ 체이닝 (연속 작업)

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

df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영'],
    '점수': [85, 90, 78, 92],
    '학과': ['컴퓨터', '경영', '컴퓨터', '경영']
})

# 메서드 체이닝으로 깔끔하게
result = (df
    .query('점수 >= 80')
    .sort_values('점수', ascending=False)
    .reset_index(drop=True)
)
print(result)

🧪 연습 문제

문제: 데이터 전처리 실습

주어진 데이터에서 1) 점수가 80점 이상인 학생만 필터링, 2) 점수 기준 내림차순 정렬, 3) ‘등급’ 열 추가(90점 이상 A, 80점 이상 B)

1
2
3
4
df = pd.DataFrame({
    '이름': ['철수', '영희', '민수', '지영', '현수'],
    '점수': [85, 90, 78, 92, 88]
})
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
import numpy as np

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

# 1. 80점 이상 필터링
result = df[df['점수'] >= 80]

# 2. 점수 내림차순 정렬
result = result.sort_values('점수', ascending=False)

# 3. 등급 추가
result['등급'] = np.where(result['점수'] >= 90, 'A', 'B')

# 인덱스 리셋
result = result.reset_index(drop=True)

print(result)

📝 오늘 배운 내용 정리

  1. 필터링: df[조건], df.query(), isin()
  2. 정렬: sort_values(), sort_index()
  3. 열 조작: 추가(df['새열']=값), 삭제(drop()), 이름변경(rename())
  4. 결측값: isnull(), dropna(), fillna()

📚 이전 학습

Day 64: Pandas 데이터 로딩 ⭐⭐

📚 다음 학습

Day 66: Pandas 그룹화와 집계 ⭐⭐


“데이터 조작이 능숙해지면 분석이 쉬워져요!” 🔧

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