ABC부트캠프

[5일차] 데이터 처리 기초(2)

수야! 2025. 6. 29. 23:05

 

[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로 제공해, 복잡한 데이터 작업을 단 몇 줄의 코드로 빠르고 정확하게 수행할 수 있게 해 줍니다.

 

 

데이터 결합 및 부분 선택

주요 내용

  1. 데이터 결합
  2. index, columns을 활용한 부분 선택
  3. 조건을 활용한 관측치 선택

목표

  1. 복수의 데이터를 적절한 방법으로 결합할 수 있다.
  2. 변수 이름 등을 활용하여 부분 데이터를 선택한다.
  3. 주제에 맞게 조건을 활용하여 부분 관측치를 선택한다.

 

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로 끝`
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…)로 변수명을 통일한 칼럼들을 한 번에 선택해 대규모 데이터프레임에서도 관심 변수를 즉시 조작