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)

 

 

 

📌 집단별 요약


  • 집단별 요약
    1. 그룹화: groupby('그룹화 할 변수') 활용
    2. 요약: 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위까지 출력
      1. suv 자동차에 해당하는 행 추출
      2. 각 자동차별 연비 합산 계산
      3. 제조 회사별로 그룹화
      4. 연비 평균 계산
      5. 내림차순 정렬
      6. 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