데이터를 자유자재로 다뤄봅시다! 🔧
필터링, 정렬, 열 추가/삭제… 실무에서 매일 쓰는 데이터 조작 기법을 배워요! 이것만 알면 웬만한 데이터 전처리는 가능합니다! 💪
(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)
|
📝 오늘 배운 내용 정리
- 필터링:
df[조건], df.query(), isin() - 정렬:
sort_values(), sort_index() - 열 조작: 추가(
df['새열']=값), 삭제(drop()), 이름변경(rename()) - 결측값:
isnull(), dropna(), fillna()
📚 이전 학습
Day 64: Pandas 데이터 로딩 ⭐⭐
📚 다음 학습
Day 66: Pandas 그룹화와 집계 ⭐⭐
“데이터 조작이 능숙해지면 분석이 쉬워져요!” 🔧
| Day 65/100 | Phase 7: 데이터 분석 기초 | #100DaysOfPython |