[Python 데이터 전처리 기초]
-기초 문법부터 데이터 결합 및 파생 변수 생성까지
<목차>
#01. 데이터 분석의 이해
#02. Python 기초 문법
#03. 데이터 처리 기초
#04. 간단한 데이터 집계 및 시각화
#05. 데이터 처리 심화
#06. 프로젝트 실습
<지난 시간 복습>
1. 라이브러리 불러오기
- import pandas as pd로 판다스 모듈을 pd라는 별칭으로 가져옵니다.
2. 파일 읽기 (I/O)
- CSV: pd.read_csv(path, encoding, index_col, header, skiprows, …)
- Excel: pd.read_excel(path, sheet_name, engine, header, skiprows, names, na_values, …)
- 주요 팁:
- encoding='utf-8' 또는 cp949 등으로 한글 깨짐 방지
- index_col로 특정 컬럼을 인덱스로 지정
- header=None·names=[…]로 컬럼명 직접 지정
- skiprows로 불필요한 메타행 건너뛰기
3. 데이터 구조 탐색
- type(df) → <class 'pandas.core.frame.DataFrame'>
- df.shape → (행 개수, 열 개수)
- df.head(n), df.tail(n) → 상·하위 n개 행 출력
- df.info() → 컬럼별 Non-Null 개수, 자료형, 메모리 사용량
- df.dtypes → 각 컬럼의 데이터 타입 확인
4. 열(Series) 접근 및 전처리
- df['col'] 또는 df.col → Series 객체
- type(df.col) → <class 'pandas.core.series.Series'>
- 결측치 처리: df.isna(), df.dropna(), df.fillna(value)
- 컬럼 추가/삭제:
- 추가: df['new'] = …
- 삭제: df.drop(columns=['col1','col2'])
5. 데이터 선택·필터링
- 인덱싱: df.loc[row_label, col_label], df.iloc[row_idx, col_idx]
- 조건 필터링: df[df['col'] > 0]
- 그룹별 집계: df.groupby('key').agg({'col':['mean','sum']})
6. 파일 저장
- CSV: df.to_csv(path, index=True/False, header=True/False, encoding, columns=[…])
- Excel: df.to_excel(path, sheet_name, index=True/False, header=True/False)
7. 한 줄 요약pandas는 읽기 → 탐색 → 전처리 → 집계 → 저장 과정을 일관된 API로 제공해, 복잡한 데이터 작업을 단 몇 줄의 코드로 빠르고 정확하게 수행할 수 있게 해 줍니다.
데이터 결합 및 부분 선택
주요 내용
- 데이터 결합
- index, columns을 활용한 부분 선택
- 조건을 활용한 관측치 선택
목표
- 복수의 데이터를 적절한 방법으로 결합할 수 있다.
- 변수 이름 등을 활용하여 부분 데이터를 선택한다.
- 주제에 맞게 조건을 활용하여 부분 관측치를 선택한다.
1. 데이터 결합
데이터 결합이란?
: 서로 같은 구조(컬럼)를 가진 DataFrame을 아래로 이어 붙여(row-wise) 합치거나,
서로 다른 구조의 데이터를 열 방향(column-wise)으로 합칠 때 사용하는 주요 함수들을 정리합니다.
1.1. concat( )을 활용한 동일 구조 데이터 행 결합
pandas.concat()
- 역할: 리스트로 전달된 DataFrame들을 하나로 이어 붙입니다.
- 행 결합(row‐wise): 구조(컬럼)가 동일한 여러 DataFrame을 아래로 이어 붙입니다.
- 열 결합(column‐wise): 구조가 다른 DataFrame을 좌우 방향으로 합칠 때도 사용할 수 있습니다.
- 기본 문법
import pandas as pd
# df_list: 결합할 DataFrame들의 리스트
# axis=0 → 행 방향 결합(아래로 이어붙이기, 기본값)
# axis=1 → 열 방향 결합(옆으로 이어붙이기)
result = pd.concat(df_list, axis=0, ignore_index=False)
주요 옵션
- axis=0 (기본): 행 결합
- axis=1: 열 결합
- ignore_index=True: 새로운 0부터 시작하는 인덱스를 부여
- keys=['A','B',…]: MultiIndex 레벨로 구분자 추가
<예제>
import pandas as pd
# 예시 DataFrame 두 개 (컬럼 구조 동일)
df1 = pd.DataFrame({
'date': ['2025-06-01','2025-06-02'],
'sales': [100, 150]
})
df2 = pd.DataFrame({
'date': ['2025-06-03','2025-06-04'],
'sales': [200, 250]
})
# 1) 행 방향 결합 (axis=0)
df_concat = pd.concat([df1, df2], axis=0, ignore_index=True)
print(df_concat)
#출력결과
date sales
0 2025-06-01 100
1 2025-06-02 150
2 2025-06-03 200
3 2025-06-04 250
# 2) 열 방향 결합 (axis=1)
# 예시: 같은 인덱스를 가진 df3
df3 = pd.DataFrame({
'region': ['A', 'B']
}, index=[0,1])
df_side = pd.concat([df1, df3], axis=1)
print(df_side)
#출력결과
date sales region
0 2025-06-01 100 A
1 2025-06-02 150 B

1.1.1 인덱스(Index)의 역할 및 초기화
정의·역할
- 인덱스는 DataFrame의 각 행을 식별하는 고유 레이블입니다.
- 기본값은 0, 1, 2, … 순번이며, .loc[인덱스값]으로 해당 행을 바로 선택할 수 있습니다.
- concat()이나 정렬 후 인덱스가 중복되거나 순서가 뒤죽박죽이 될 수 있어,
새로 매긴 순차 인덱스가 필요할 때가 많습니다.
주요 메서드
df.index
>>> df_apt.index
Int64Index([0, 1, 2, …, 75], dtype='int64')
df.reset_index(drop=True, inplace=False)
- drop=True: 기존 인덱스 버리고
- inplace=True: 원본 DataFrame에 바로 적용
<예제>
import pandas as pd
# 예시: 인덱스 중복 발생
df1 = pd.DataFrame({'x':[1,2]})
df2 = pd.DataFrame({'x':[3,4]})
df2.index = [0,1] # 인덱스 0,1 그대로
df_all = pd.concat([df1, df2], axis=0)
print(df_all.index)
# → Int64Index([0, 1, 0, 1], dtype='int64')
# reset_index()로 0부터 다시 매기기
df_clean = df_all.reset_index(drop=True)
print(df_clean.index)
# → RangeIndex(start=0, stop=4, step=1)
1.1.2. glob과 for 반복문을 활용한 다중 파일 처리
정의·역할
- glob은 파일 경로 패턴(와일드카드)을 이용해 파일 목록을 한 번에 조회하는 표준 라이브러리입니다.
- for 루프와 결합해, 폴더에 있는 여러 CSV·Excel 파일을 일괄 불러와 처리할 때 유용합니다.
주요 사용법
- from glob import glob
- paths = glob('./data/CARD_SUBWAY_MONTH_*.csv')
- for path in paths: df = pd.read_csv(path); targets.append(df)
<예제>
import pandas as pd
from glob import glob
# ① 파일 목록 수집
paths = glob('./data/CARD_SUBWAY_MONTH_*.csv')
print(paths)
# → ['./data/CARD_SUBWAY_MONTH_201907.csv',
# './data/CARD_SUBWAY_MONTH_202007.csv',
# './data/CARD_SUBWAY_MONTH_202107.csv']
# ② 반복문으로 모두 불러와 리스트에 저장
dfs = []
for p in paths:
tmp = pd.read_csv(p, encoding='CP949')
dfs.append(tmp)
# ③ concat으로 결합
df_subway = pd.concat(dfs, axis=0)
print(df_subway.shape)
# → (전체 행 개수, 컬럼 개수)
1.1.3. 인덱스 초기화 순서
# 1) concat만 한 상태 (인덱스 중복)
df_raw = pd.concat(dfs, axis=0)
print(df_raw.index[:6])
# → Int64Index([0,1,2, …, 0,1,2], …)
# 2) reset_index(drop=True) 비파괴
df_clean = df_raw.reset_index(drop=True)
print(df_clean.index[:6])
# → RangeIndex(start=0, stop=6, step=1)
# 3) reset_index(inplace=True) 원본 변경
df_raw.reset_index(drop=True, inplace=True)
print(df_raw.index[:6])
# → RangeIndex(start=0, stop=6, step=1)
1.2. merge()를 활용한 KEY 변수 기준 결합
SQL의 JOIN, Excel의 VLOOKUP()과 같이 KEY 변수를 활용한 데이터 결합은 merge() 를 활용합니다.
merge()란?
: merge()는 판다스에서 키(key) 기준으로 두 개의 DataFrame을 합치는 함수로, SQL의 JOIN이나 Excel의 VLOOKUP과 동일한 개념입니다.
- on: 조인에 사용할 공통 키 컬럼 이름
- how: 조인 방식 (inner, left, right, outer)
<예제 데이터>
import pandas as pd
df_left = pd.DataFrame({
'category': ['A', 'B', 'C', 'D'],
'value_left': [10, 20, 30, 40]
})
df_right = pd.DataFrame({
'category': ['B', 'C', 'D', 'E'],
'value_right': [100, 200, 300, 400]
})

1.2.1. Inner Join (how='inner')
- 교집합: 양쪽에 모두 존재하는 키만 남깁니다.
df_inner = pd.merge(df_left, df_right, how='inner', on='category')
print(df_inner)
#출력결과
category value_left value_right
0 B 20 100
1 C 30 200
2 D 40 300
1.2.2. Left Join (how='left')
- 왼쪽 기준: 왼쪽 DataFrame의 모든 키를 유지하고, 오른쪽에 없는 키는 NaN 처리합니다.
df_left_join = pd.merge(df_left, df_right, how='left', on='category')
print(df_left_join)
#출력결과
category value_left value_right
0 A 10 NaN
1 B 20 100.0
2 C 30 200.0
3 D 40 300.0
1.2.3. Right Join (how='right')
- 오른쪽 기준: 오른쪽 DataFrame의 모든 키를 유지하고, 왼쪽에 없는 키는 NaN 처리합니다.
df_right_join = pd.merge(df_left, df_right, how='right', on='category')
print(df_right_join)
#출력결과
category value_left value_right
0 B 20.0 100
1 C 30.0 200
2 D 40.0 300
3 E NaN 400
1.2.4. Outer Join (how='outer')
- 합집합: 양쪽 키를 모두 포함하고, 매칭되지 않는 위치를 NaN으로 채웁니다.
df_outer = pd.merge(df_left, df_right, how='outer', on='category')
print(df_outer)
#출력결과
category value_left value_right
0 A 10.0 NaN
1 B 20.0 100.0
2 C 30.0 200.0
3 D 40.0 300.0
4 E NaN 400.0
언제 어떤 조인을 쓰나요?
- inner: 두 데이터 세트에서 공통된 관측치만 분석할 때
- left: 주 데이터(df_left)를 모두 보존하며, 부가 정보를 df_right에서 가져올 때
- right: 부가 데이터(df_right) 전체를 보존하고, 주 데이터에서 일치하는 정보만 합칠 때
- outer: 모든 관측치를 포함하여 빠진 부분은 NaN으로 채우고 싶을 때
이처럼 merge()를 사용하면 분석 목적에 맞춰 필요한 관측치만 또는 모두 포함한 형태로 데이터를 유연하게 결합할 수 있습니다.

2. 데이터 부분 선택
일반적인 비즈니스 데이터 분석에서 주제와 기간, 사이트, 제품, 공정 등 본인의 업무와 관련이 있는 일부 데이터만 선택하고 활용합니다. 그리고 SQL을 활용한 데이터 추출 과정과 별개로 Python에서 각 분석 과정에서 맞게 부분 데이터를 다시 선택하고 사용합니다.


2.1. 데이터프레임의 변수(열) 선택 방법
2.1.1. 점(.) 연산자 + 자동완성(Tab)
- 방법: DataFrame 뒤에 .을 찍고 Tab 키를 눌러 변수(열) 이름을 자동으로 완성할 수 있습니다.
- 제약:
- 변수 이름이 공백이나 특수문자(-, % 등)를 포함하지 않아야 합니다.
- 숫자로 시작하면 사용할 수 없습니다.
import pandas as pd
# 예시 DataFrame 생성
df = pd.DataFrame({
'age': [25, 32, 40],
'sex': ['M','F','F'],
'income': [50000, 60000, 70000]
})
# 1) . 연산자 사용
# (Jupyter에서 df. 을 타이핑한 뒤 Tab을 누르면 ['age','income','sex'] 등이 나열됩니다)
ages = df.age
print(type(ages))
print(ages)
#출력결과
<class 'pandas.core.series.Series'>
0 25
1 32
2 40
Name: age, dtype: int64
2.1.2. 대괄호([]) 연산자
- 방법: df['column_name'] 형태로 변수(열)를 지정합니다.
- 장점:
- 변수 이름에 공백이나 특수문자가 있어도 사용 가능
- 여러 개의 열을 리스트로 한 번에 선택할 수 있음
# 2) 대괄호 연산자 사용
# 단일 열 선택
sex = df['sex']
print(type(sex))
print(sex)
# 다중 열 선택
subset = df[['age','income']]
print(type(subset))
print(subset)
#출력결과
<class 'pandas.core.series.Series'>
0 M
1 F
2 F
Name: sex, dtype: object
<class 'pandas.core.frame.DataFrame'>
age income
0 25 50000
1 32 60000
2 40 70000
| 구분 | df.col | df['col'] |
| 입력 방식 | df.col | df['col'] |
| 사용 가능 열 | 공백·특수문자 없는 열만 | 모든 열 이름 |
| 다중 열 선택 | 불가능 | df[['col1','col2',…]] 형태로 가능 |
| 반환 타입 | Series | 단일 열 선택 시 Series, 복수 열 선택 시 DataFrame |
| 장점 | 간단히 입력 가능 | 유연하게 모든 열 이름을 지정 가능 |
| 제약 | 이름 충돌 위험(메서드명과 동일 시) | 대괄호·따옴표 입력 필요 |
2.2. 대괄호를 활용한 데이터 부분 선택
: DataFrame에 대괄호를 붙이고 슬라이스:로 관측치 번호를 지정하거나 따옴표''로 변수 이름을 넣어 데이터 부분을 선택이 가능합니다. 그리고 변수 이름을 리스트 형식으로 묶어 넣어 여러개 변수를 한번에 선택 가능합니다.
| 표현 | 설명 |
| df[start:stop] | 행을 번호(0-based)로 슬라이스하여 선택 (stop 미포함) |
| df['col'] | 단일 열을 선택 (반환: Series) |
| df[['col1','col2',…]] | 복수 열을 리스트로 한꺼번에 선택 (반환: DataFrame) |
| df[['c1','c2']][r1:r2] | “먼저 열 선택” 후 “행 슬라이스” 결합 |
<예제코드>
import pandas as pd
# 예시 DataFrame
df = pd.DataFrame({
'age': [25, 32, 40, 28],
'sex': ['M','F','F','M'],
'income': [50000, 60000, 70000, 55000]
})
print(df)
#출력결과
age sex income
0 25 M 50000
1 32 F 60000
2 40 F 70000
3 28 M 55000
2.2.1. 행 번호(인덱스)로 슬라이스
# df[start:stop] → 행 인덱스 start부터 stop-1까지 선택
print(df[1:3]) # 인덱스 1, 2번 행
#출력결과
age sex income
1 32 F 60000
2 40 F 70000
2.2.2. 단일 열 선택
# df['col'] → 해당 열을 Series로 반환
print(df['age'])
#출력결과
0 25
1 32
2 40
3 28
Name: age, dtype: int64
2.2.3. 복수 열 선택
# df[['col1','col2',…]] → 여러 열을 DataFrame으로 반환
print(df[['age','income']])
#출력결과
# df[['col1','col2',…]] → 여러 열을 DataFrame으로 반환
print(df[['age','income']])
2.2.4. 열 선택 후 행 슬라이스 결합
# 먼저 복수 열 선택 → 그 결과에 행 슬라이스
print(df[['age','income']][2:4])
#출력결과
age income
2 40 70000
3 28 55000
2.3. loc과 iloc을 활용한 관측치/변수 선택
: loc은 행 이름(index)과 열 이름(column)으로 데이터에서 일부를 선택하고, iloc은 정수(integer) 형식의 행 번호, 열 번호를 활용합니다. 두 방법 모두 리스트[ ]나 슬라이스:를 활용한 방법을 지원합니다.
2.3.1 loc (Label 기반 선택)
- 행: 실제 인덱스 이름(레이블)
- 열: 실제 열 이름
- 슬라이스: 끝 레이블 포함
- 리스트: 다중 레이블 선택 가능
import pandas as pd
# 예시 DataFrame
df = pd.DataFrame({
'age': [25, 32, 40, 28],
'sex': ['M','F','F','M'],
'income': [50000, 60000, 70000, 55000]
}, index=['a','b','c','d'])
print(df)
#출력코드
age sex income
a 25 M 50000
b 32 F 60000
c 40 F 70000
d 28 M 55000
<단일 행/열 선택>
# 행 레이블 'b', 열 레이블 'income'
print(df.loc['b','income'])
#출력예제
60000
<행 레이블 슬라이스, 열 리스트>
# 행 'a'부터 'c'까지, 열 ['age','sex']
print(df.loc['a':'c', ['age','sex']])
#출력예제
age sex
a 25 M
b 32 F
c 40 F
2.3.2 iloc (정수 위치 기반 선택)
- 행: 0-based 정수 위치
- 열: 0-based정수 위치
- 슬라이스: 끝 위치 미포함
- 리스트: 다중 위치 선택 가능
<단일 위치 선택>
# 1번째 행(인덱스 1), 2번째 열(인덱스 2)
print(df.iloc[1,2])
#출력예제
60000
<위치 슬라이스 + 열 위치 리스트>
# 행 0~1(0,1), 열 0~1(0,1)
print(df.iloc[0:2, 0:2])
#출력예제
age sex
a 25 M
b 32 F
2.3.3. 요약 비교
| 구분 | loc | iloc |
| 기준 | 레이블 (인덱스, 컬럼 이름) | 정수 위치 (0-based 행/열 번호) |
| 슬라이스 | df.loc['a':'c'] → 끝 레이블 포함 | df.iloc[0:2] → 끝 위치 미포함 |
| 리스트 | df.loc[['a','c'], ['age','sex']] 가능 | df.iloc[[0,2], [0,1]] 가능 |
2.4. 함수를 활용한 여러 변수 선택
2.4.1. filter() 메서드
- 용도: 컬럼 이름에 패턴(정규표현식)을 적용해 일치하는 변수(열)만 선택
- 주요 파라미터:
- regex : 정규표현식 패턴
- '^s' → 이름이 s로 시작
- 's$' → 이름이 s로 끝`
- regex : 정규표현식 패턴
import pandas as pd
# 예시 DataFrame
df_pr = pd.DataFrame({
'sex': ['M','F','M','F'],
'smoker': ['yes','no','no','yes'],
'age': [25,32,40,28],
'charges': [2000, 1500, 4000, 3000]
})
# 's'로 시작하는 컬럼 선택
print(df_pr.filter(regex='^s'))
#출력코드
sex smoker
0 M yes
1 F no
2 M no
3 F yes
# 's'로 끝나는 컬럼 선택
print(df_pr.filter(regex='s$'))
#출력코드
charges
0 2000
1 1500
2 4000
3 3000
2.4.2. select_dtypes() 메서드
- 용도: 데이터 타입 기준으로 변수(열)를 선택
- 주요 인자:
- include / exclude : 'number', 'object', 'float', 'int' 등
# 예시 DataFrame (보험료 데이터 구조 모사)
df_ins = pd.DataFrame({
'age': [25,32,40],
'sex': ['M','F','F'],
'bmi': [22.4, 28.1, 30.2],
'smoker': ['no','yes','no'],
'charges': [3200.5, 5400.0, 2300.7]
})
print(df_ins.dtypes)
#출력코드
age int64
sex object
bmi float64
smoker object
charges float64
dtype: object
# 1) 수치형 변수만 선택
num_df = df_ins.select_dtypes(include='number')
print(num_df)
#출력코드
age bmi charges
0 25 22.4 3200.5
1 32 28.1 5400.0
2 40 30.2 2300.7
# 2) 문자열(object) 변수만 선택
obj_df = df_ins.select_dtypes(include='object')
print(obj_df)
#출력코드
sex smoker
0 M no
1 F yes
2 F no
filter(regex=…) 로 이름 패턴을, select_dtypes(include=…) 로 자료형을 기준으로 원하는 변수들을 간편하게 골라낼 수 있습니다.
3.5. 조건을 활용한 관측치 선택
판다스에서는 SQL의 WHERE 절이나 Excel의 필터처럼, 조건식을 통해 관측치(행) 를 골라낼 수 있습니다.
[ ]나 .loc[ ] 안에 조건식을 넣어서 조건과 일치하는 관측치만 선택이 가능합니다.
3.5.1. 기본 단일 조건 필터링
# 예시 DataFrame
import pandas as pd
df_ins = pd.DataFrame({
'age': [22, 35, 28, 41],
'sex': ['female','male','female','male'],
'region': ['southeast','southwest','northeast','northwest'],
'charges':[2000,3000,2500,4000]
})
# 1) 조건을 생성 (bool Series)
cond = df_ins['age'] < 30
print(cond)
#출력코드
0 True
1 False
2 True
3 False
Name: age, dtype: bool
# 2) loc (레이블 기반) 또는 [] 로 필터링
print(df_ins.loc[cond])
#출력코드
age sex region charges
0 22 female southeast 2000
2 28 female northeast 2500
3.5.2. 복합 조건 결합 (&, |)
cond1 = df_ins['age'] < 30
cond2 = df_ins['sex'] == 'female'
# AND 조합 (둘 다 True)
print(df_ins[cond1 & cond2])
#출력결과
age sex region charges
0 22 female southeast 2000
2 28 female northeast 2500
# OR 조합 (둘 중 하나라도 True)
print(df_ins[(df_ins['age'] < 30) | (df_ins['sex'] == 'male')])
#출력결과
age sex region charges
0 22 female southeast 2000
1 35 male southwest 3000
2 28 female northeast 2500
3 41 male northwest 4000
3.5.3 isin()으로 범주(카테고리) 필터링
# 관심 있는 region 목록
regions_of_interest = ['southeast','northwest']
cond = df_ins['region'].isin(regions_of_interest)
print(df_ins.loc[cond])
#출력코드
age sex region charges
0 22 female southeast 2000
3 41 male northwest 4000
3.5.4. 문자열 메서드로 패턴 매칭 (str)
# 예시 StudentsPerformance DataFrame
df_sp = pd.DataFrame({
'parental level of education': [
'bachelor degree', 'some college',
'high school', 'master degree'
],
'math score': [88, 92, 76, 85]
})
# 'b'로 시작하는 경우
print(df_sp[df_sp['parental level of education']
.str.startswith('b')])
#출력코드
parental level of education math score
0 bachelor degree 88
3.5.5. between()으로 범위 필터링
# 80 ≤ math score < 90
cond = df_sp['math score'].between(80, 90, inclusive='left')
print(df_sp[cond])
#출력코드
parental level of education math score
0 bachelor degree 88
3 master degree 85
매개변수
- left : 80 ≤ x < 90
- right : 80 < x ≤ 90
- both : 80 ≤ x ≤ 90
- neither: 80 < x < 90
3.5.6. 불리언 반전 (~)
# 위 between 조건의 반대
cond = df_sp['math score'].between(80, 90, inclusive='left')
print(df_sp[~cond])
#출력코드
parental level of education math score
1 some college 92
2 high school 76
2.6. 함수를 활용한 부분 관측치 선택
2.6.1. head(n)
- 역할: 처음부터 n개의 행을 반환합니다.
- 매개변수:
- n (int, 기본 5) — 반환할 행 개수
- 반환형: DataFrame (첫 n개 행)
- 용도: 데이터 구조·변수명·첫 인상 확인
2.6.2. tail(n)
- 역할: 끝에서부터 n개의 행을 반환합니다.
- 매개변수
- n (int, 기본 5) — 반환할 행 개수
- 반환형: DataFrame (마지막 n개 행)
- 용도: 데이터 맨 끝 부분 확인, 로그 데이터 확인
2.6.3. sample(n=None, frac=None)
- 역할: 무작위로 행을 샘플링합니다.
- 매개변수
- n (int) — 샘플할 행 개수
- frac (float) — 샘플할 비율 (0<frac≤1)
- random_state (int) — 재현 가능한 시드
- 반환형: DataFrame (무작위 추출된 행)
- 용도: 전체가 아닌 대표관측 탐색, 검증용 데이터 분할
2.6.4. nlargest(n, columns)
- 역할: 지정한 컬럼에서 큰 값 기준 상위 n개 행 선택합니다.
- 매개변수
- n (int) — 상위 개수
- columns (str or list) — 정렬 기준 컬럼(들)
- 반환형: DataFrame (상위 n개 행)
- 용도: 극단값·최상위 관측 확인, 성과 상위 그룹 식별
2.6.5. nsmallest(n, columns)
- 역할: 지정한 컬럼에서 작은 값 기준 하위 n개 행 선택합니다.
- 매개변수
- n (int) — 하위 개수
- columns (str or list) — 정렬 기준 컬럼(들)
- 반환형: DataFrame (하위 n개 행)
- 용도: 극단적 저수치·하위 그룹 확인
2.7. 중복값 제거
이론
- 용도: DataFrame에서 중복된 행(row) 을 찾아 제거합니다.
- 기본 동작:
- 모든 컬럼을 기준으로 완벽히 같은 행을 중복으로 간주
- 첫 번째 중복만 남기고 나머지를 제거 (keep='first')
- 주요 파라미터:
- subset : 중복 판단에 사용할 컬럼 이름 리스트 (기본: 모든 컬럼)
- keep : 어떤 중복을 남길지
- 'first' (기본) – 첫 번째 남기고 나머지 제거
- 'last' – 마지막만 남기고 앞쪽 제거
- False – 모든 중복 행 제거
- inplace : True로 설정하면 원본 DataFrame에 바로 적용
< 코드 예제 및 출력 결과 >
import pandas as pd
# 예시 DataFrame: 이름과 과목 점수
df = pd.DataFrame({
'student': ['Alice', 'Bob', 'Alice', 'Bob', 'Charlie', 'Bob'],
'subject': ['Math', 'Math', 'Math', 'Eng', 'Eng', 'Eng'],
'score': [90, 80, 90, 85, 75, 85]
})
print("원본 데이터:\n", df, "\n")
#출력코드
원본 데이터:
student subject score
0 Alice Math 90
1 Bob Math 80
2 Alice Math 90
3 Bob Eng 85
4 Charlie Eng 75
5 Bob Eng 85
2.7.1. 전체 기준 중복 제거
# 모든 컬럼 값이 동일한 행만 중복으로 간주
df_unique = df.drop_duplicates()
print("전체 기준 중복 제거:\n", df_unique, "\n")
#출력코드
전체 기준 중복 제거:
student subject score
0 Alice Math 90
1 Bob Math 80
3 Bob Eng 85
4 Charlie Eng 75
2.7.2. 특정 컬럼(subset) 기준 중복 제거
# 'student'와 'subject' 컬럼만 보고 중복 판단
df_sub = df.drop_duplicates(subset=['student','subject'])
print("이름+과목 기준 중복 제거:\n", df_sub, "\n")
#출력코드
이름+과목 기준 중복 제거:
student subject score
0 Alice Math 90
1 Bob Math 80
3 Bob Eng 85
4 Charlie Eng 75
2.7.3. 마지막(keep='last') 또는 모두 제거(keep=False)
# 마지막만 남기기
df_last = df.drop_duplicates(subset=['student','subject'], keep='last')
print("keep='last':\n", df_last, "\n")
# 모든 중복 행 제거
df_none = df.drop_duplicates(subset=['student','subject'], keep=False)
print("keep=False:\n", df_none)
#출력코드
keep='last':
student subject score
2 Alice Math 90
1 Bob Math 80
5 Bob Eng 85
4 Charlie Eng 75
keep=False:
student subject score
4 Charlie Eng 75
2.8. 관측치 정렬
이론
- 목적: 특정 컬럼(들)의 값을 기준으로 DataFrame의 행을 정렬
- 주요 파라미터:
- by : 정렬 기준 컬럼명 또는 컬럼명 리스트
- ascending: True(기본, 오름차순) 또는 False(내림차순)
- inplace : True로 설정하면 원본 DataFrame을 직접 변경
- na_position: ‘first’(결측을 맨 앞) 또는 ‘last’(결측을 맨 뒤, 기본)
- 반환값: 정렬된 새 DataFrame (단, inplace=True 시 None)
< 코드 예제 및 출력 결과 >
import pandas as pd
# 예시 DataFrame
df = pd.DataFrame({
'age': [22, 35, 28, 41, 30],
'sex': ['female','male','female','male','female'],
'charges': [2300, 4500, 3200, 7800, 4100]
})
print("원본 데이터:")
print(df, "\n")
#출력코드
원본 데이터:
age sex charges
0 22 female 2300
1 35 male 4500
2 28 female 3200
3 41 male 7800
4 30 female 4100
2.8.1. 단일 기준 오름차순 정렬 (age 기준)
sorted_df = df.sort_values(by='age')
print("age 오름차순 정렬:")
print(sorted_df, "\n")
#출력코드
age 오름차순 정렬:
age sex charges
0 22 female 2300
2 28 female 3200
4 30 female 4100
1 35 male 4500
3 41 male 7800
2.8.2. 단일 기준 내림차순 정렬 (charges 기준)
desc_df = df.sort_values(by='charges', ascending=False)
print("charges 내림차순 정렬:")
print(desc_df, "\n")
#출력코드
charges 내림차순 정렬:
age sex charges
3 41 male 7800
1 35 male 4500
4 30 female 4100
2 28 female 3200
0 22 female 2300
2.8.3. 복수 기준 정렬 (sex 오름차순, 그 안에서 age 내림차순)
multi_df = df.sort_values(by=['sex','age'], ascending=[True, False])
print("sex 오름차순, age 내림차순 정렬:")
print(multi_df)
#출력코드
sex 오름차순, age 내림차순 정렬:
age sex charges
4 30 female 4100
2 28 female 3200
0 22 female 2300
3 41 male 7800
1 35 male 4500
<마무리>

벌써 5일차라니! 데이터분석을 공부한지 1주가 되었네요.
오늘은 헷갈리는 것도 많고 완벽하게 이해하지 못하고 넘어간 부분도 많았습니다.
하지만 주말을 통해 또 열심히 해봐야겠죠? 끝까지 가보자고~
오늘 배운 내용중에 여러 개의 CSV 파일을 concat()으로 하나로 묶고, merge()로 외부 데이터를 결합하는 과정을 통해 흩어진 퍼즐 조각이 한꺼번에 맞춰지는 쾌감을 느꼈는데요. 어라랏? 제 적성을 찾았을지도ㅋㅋㅋ!
인덱스 초기화(reset_index)와 중복 제거(drop_duplicates), 조건 필터링(loc, Boolean Masking) 등을 이용해 데이터 정제의 중요성을 직접 체감할 수 있어서 좋았으며, 부분 선택(filter(), select_dtypes(), nlargest(), nsmallest())으로 꼭 필요한 정보만 빠르게 꺼내볼 수 있어, 빠른 탐색(EDA)이 가능하다는 점이 인상적이었습니다.
+<데이터 분석 응용>
실무에서의 활용 방안
- 사전 정제 단계: 서로 다른 시스템에서 넘어온 여러 파일을 glob + concat으로 일괄 결합한 뒤, 인덱스·중복·불필요 열을 깔끔히 정리하고 분석 준비
- 데이터 결합 전략:
- 시간 연속성 분석: 월별·분기별 매출 데이터를 concat()으로 합친 뒤, 인구 통계나 기상 데이터를 merge()해 시계열과 외부 변수의 상관관계를 탐구
- 공공 데이터 연계: 교통카드, 기상청, 건강보험 공시자료 등을 키(date, region, station) 기준으로 merge()해 “언제, 어디서, 누가” 이동·소비·건강위험이 높은지 파악
- 조건·부분 선택:
- 상위·하위 집단 추출(nlargest(), nsmallest())으로 극단치를 점검하고, loc와 isin으로 특정 그룹(예: 고령자, 농어촌 지역주민) 선택
- filter(regex…)로 변수명을 통일한 칼럼들을 한 번에 선택해 대규모 데이터프레임에서도 관심 변수를 즉시 조작
'ABC부트캠프' 카테고리의 다른 글
| [7일차] 인구 데이터 분석 및 시각화 (3) | 2025.07.05 |
|---|---|
| [6일차] 간단한 데이터 집계와 데이터 처리 심화 (1) | 2025.07.02 |
| [4일차] Python 기초 문법(3) 및 데이터 처리 기초(1) (0) | 2025.06.29 |
| [3일차] Python 기초 문법(2) (1) | 2025.06.29 |
| [2일차]데이터 분석의 이해, Python 기초 문법(1) (1) | 2025.06.26 |