4. 데이터 가공(전처리)
🔗 'Do it! 쉽게 배우는 파이썬 데이터 분석' 책을 기반으로 JupyterLab 환경에서 학습한 내용입니다 _φ(๑╹╹๑)
📌 조건에 맞는 데이터 추출
- 실습 데이터 불러오기
import pandas as pd
exam = pd.read_csv('exam.csv')
- 조건에 맞는 행 추출: 데이터프레임의 query('조건') 함수 활용
exam.query('nclass == 1') # 1반에 해당하는 행 추출
# exam.query('nclass != 1'): 1반에 해당하지 않는 행 추출

- 여러 조건을 충족하는 행 추출: &(그리고) 연산자 활용
exam.query('nclass == 1 & math >= 50') # 1반이면서 math가 50점 이상인 행 추출

- 여러 조건 중 하나 이상 충족하는 행 추출: |(또는) 연산자 활용
exam.query('math >= 90 | english >= 90') # math가 90점 이상이거나 english가 90점 이상인 행 추출

- 목록에 해당하는 행 추출: in 활용
# 1, 3, 5반 행 추출
exam.query('nclass in [1, 3, 5]')
"""
참고 Tip
exam[exam['nclass'].isin([1, 3, 5])] 과 동일한 출력
exam['nclass'].isin([1, 3, 5]) 출력 결과:
0 True
1 True
2 True
3 True
4 False
5 False
....
Name: nclass, dtype: bool
"""
- 추출한 행 데이터 프레임으로 저장: = 연산자 활용 → 얕은 복사이므로 수정시 오류 발생할 수 O ι(`・-・´)/
nclass1 = exam.query('nclass == 1') # 1반에 해당하는 행 nclass1에 할당
nclass2 = exam.query('nclass == 2') # 2반에 해당하는 행 nclass2에 할당
nclass1['math'].mean() # nclass1의 math 평균

- 문자 변수를 활용한 조건에 맞는 행 추출
- 조건 전체를 " "로 감싼 경우, 문자는 ' '로
- 조건 전체를 ' '로 감싼 경우, 문자는 " "로
df = pd.DataFrame({'sex': ['F', 'M', 'F', 'M'],
'country': ['Korea', 'China', 'Japan', 'USA']})
df.query('sex == "F" & country == "Korea"')
df.query("sex == 'F' & country == 'Korea'")
- 외부 변수를 활용한 조건에 맞는 행 추출: @ 활용
var = 3
exam.query('nclass == @var') # nclass가 3에 해당하는 행 추출
📌 필요한 변수만 추출
- 변수 추출: [] 활용
exam['math'] # math 추출(시리즈 형태로 출력)
"""
참고 Tip: exam[['math']]으로 출력하면 데이터 프레임 구조로 출력
"""

- 여러 변수 추출: [[]] 활용
exam[['math', 'english', 'science']] # math, english, science 추출

- 특정 변수 제외 추출: 데이터프레임의 drop() 함수 활용
- 변수 1개 제외: drop(columns = '변수명') 활용
- 변수 여러개 제외: drop(columns = ['변수명1', '변수명2', ..]) 활용
exam.drop(columns = 'math') # math 제거
exam.drop(columns = ['math', 'english']) # math, english 제거

- query()와 [] 조합
exam.query('nclass == 1')['english'] # 1반에 해당하는 행에서 english만 추출

exam.query('nclass == 1')[['id', 'math']].head() # 1반에 해당하는 행에서 id, math만 추출하고, 상위 5행 출력
"""각 명령어마다 '\ + enter'를 실시하면 가독성 좋게 작성 가능
exam.query('nclass == 1')\
[['id', 'math']]\
.head()
""

📌 순서대로 정렬
- 오름차순 정렬: 데이터프레임의 sort_values('기준 변수명') 활용
exam.sort_values('math') # math 성적 기준 오름차순 정렬

- 내림차순 정렬: ascending = False 설정
exam.sort_values('math', ascending = False) # math 성적 기준 내림차순 정렬
- 여러 정렬 기준 적용: sort_values(['기준 변수명1', '기준 변수명2', ..]) 활용
exam.sort_values(['nclass', 'math']) # 반 기준 오름차순 정렬 후, 각 반에서 math 성적 기준 오름차순 정렬

# 반 기준 오름차순 정렬 후, 각 반에서 math 성적 내림차순 정렬
exam.sort_values(['nclass', 'math'], ascending = [True, False])

📌 파생변수 추가
- 파생변수 추가: 데이터프레임의 assign(새 변수명 = 변수를 만드는 공식) 활용
exam.assign(total = exam['math'] + exam['english'] + exam['science'])
# total 변수(math + english + science 총 합) 생성

- 여러 파생변수 추가: assign(새 변수명1 = 변수를 만드는 공식, 새 변수명2 = 변수를 만드는 공식, ...)
exam.assign(total = exam['math'] + exam['english'] + exam['science'],
mean = (exam['math'] + exam['english'] + exam['science']) / 3)
# total, mean 변수 추가

- 파생변수에 조건에 따른 값 부여: assign(새 변수명 = np.where(조건, '참인 경우', '거짓인 경우'))
import numpy as np
exam.assign(test = np.where(exam['science'] >= 60, 'pass', 'fail'))

- 데이터 프레임명 줄여쓰기: lambda 활용
- lambda x : 수식 → x를 입력 받아서 수식 결과를 출력
exam.assign(total = lambda x: x['math'] + x['english'] + x['science']) # x 자리에 exam 활용됨
- 앞에서 만든 파생 변수를 이용해 다른 파생 변수 생성: 다른 파생 변수 생성에 반드시 lambda 활용
"""
exam.assign(total = exam['math'] + exam['english'] + exam['science'],
mean = lambda x: x['total'] / 3)"""
exam.assign(total = lambda x: x['math'] + x['english'] + x['science'],
mean = lambda x: x['total'] / 3)
📌 집단별 요약
- 집단별 요약
- 그룹화: groupby('그룹화 할 변수') 활용
- 요약: agg(할당할 변수명 = ('사용할 변수명', '사용할 함수명')) 활용
함수 통계량 mean() 평균 std() 표준편차 sum() 합계 min() 최소값 max() 최대값 median() 중앙값 count() 빈도(개수)
exam.groupby('nclass').agg(mean_math = ('math', 'mean')) # 반 별 math 평균 계산

# as_index = False 설정: nclass가 index가 되지 않도록 설정 (= nclass가 행의 이름이 되지 않도록)
exam.groupby('nclass', as_index = False).agg(mean_math = ('math', 'mean'))

- 여러 요약 통계량 계산
exam.groupby('nclass', as_index = False)\
.agg(mean_math = ('math', 'mean'),
sum_math = ('math', 'sum'),
median_math = ('math', 'median'),
n = ('nclass', 'count'))
# mean_math: 반 별 math 평균
# sum_math: 반 별 math 총 합
# median_math = 반 별 math 중앙값
# n = 반 별 학생 수 (count = nclass열의 행 개수를 셈)

- 모든 변수 요약 통계량 한 번에 추출
exam.groupby('nclass').mean() # 반 별 모든 변수의 평균 계산

- 집단별로 다시 집단 나누기: groupby(['먼저 그룹화 할 변수명', 하위 그룹화 할 변수명'])
# 1. 제조 회사별로 그룹화 한 다음 구동 방식 별 그룹화
# 2. 각 제조 회사의 구동 방식 별 도시 연비 평균 계산
mpg.groupby(['manufacturer', 'drv']).agg(mean_cty = ('cty', 'mean'))

- 여러 함수 조합 ι(`・-・´)/
- 제조 회사별로 suv 자동차의 도시 및 고속도로 합산 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력
- suv 자동차에 해당하는 행 추출
- 각 자동차별 연비 합산 계산
- 제조 회사별로 그룹화
- 연비 평균 계산
- 내림차순 정렬
- 1~5위까지 출력
- 제조 회사별로 suv 자동차의 도시 및 고속도로 합산 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력
mpg.query('category == "suv"')\
.assign(total = (mpg['cty'] + mpg['hwy']) / 2)\
.groupby('manufacturer', as_index = False)\
.agg(mean_total = ('total', 'mean'))\
.sort_values('mean_total', ascending = False)\
.head()
📌데이터 합치기
- 가로로 합치기(열 추가) : merge(결합할 데이터 프레임명1, 결합할 테이터 프레임명2, how = '방향', on = '기준 변수명') 활용
- how = 'left': 왼쪽 데이터 프레임을 기준으로 결합
- how = 'right': 오른쪽 데이터 프레임을 기준으로 결합
name = pd.DataFrame({'nclass': [1, 2, 3, 4, 5],
'teacher': ['kim', 'lee', 'park', 'choi', 'jung']})
# 'nclass' 변수를 기준으로 exam 데이터 프레임과 name 데이터 프레임을 결합
new_exam = pd.merge(exam, name, how = 'left', on = 'nclass')
new_exam

- 세로로 합치기(행 추가): concat([결합할 데이터 프레임명1, 결합할 데이터 프레임명2])
# 학생 1~5번 시험 데이터 만들기
group_a = pd.DataFrame({'id': [1, 2, 3, 4, 5],
'test': [60, 80, 70, 90, 85]})
# 학생 6~10번 시험 데이터 만들기
group_b = pd.DataFrame({'id': [6, 7, 8, 9, 10],
'test': [70, 83, 65, 95, 80]})
new_data = pd.concat([group_a, group_b])
new_data

'데이터 분석 > Python' 카테고리의 다른 글
| 6. 데이터 시각화(seaborn 패키지) (0) | 2026.07.20 |
|---|---|
| 5. 데이터 정제(결측치, 이상치) (0) | 2026.07.17 |
| 3. 데이터 파악 및 수정 (0) | 2026.07.15 |
| 2. DataFrame (0) | 2026.07.14 |
| 1. 변수, 함수, 모듈, 패키지 (0) | 2026.07.13 |