Pandas DataFrame 완벽 가이드: 데이터 분석 기초부터 실무 활용까지

DataFrame이란 무엇인가?

DataFrame은 Python의 대표적인 데이터 분석 라이브러리인 Pandas에서 제공하는 2차원 테이블 형태의 자료구조입니다. 엑셀 스프레드시트나 SQL 테이블과 유사한 구조로, 행(row)과 열(column)로 구성되어 있어 직관적으로 데이터를 다룰 수 있습니다.

DataFrame은 데이터 분석의 핵심 도구로, 데이터 정제, 변환, 집계, 시각화 등 거의 모든 데이터 작업에 활용됩니다.

DataFrame의 주요 특징

  • 다양한 데이터 타입 지원: 숫자, 문자열, 날짜 등 여러 타입을 하나의 테이블에 저장
  • 유연한 인덱싱: 행과 열에 라벨을 부여하여 직관적인 데이터 접근 가능
  • 강력한 데이터 처리: 결측치 처리, 필터링, 그룹화 등 다양한 기능 내장
  • 다른 포맷과의 호환성: CSV, Excel, JSON, SQL 등 다양한 형식으로 입출력 가능

DataFrame 생성하기

1. 딕셔너리로 생성

가장 기본적인 방법은 Python 딕셔너리를 활용하는 것입니다.

import pandas as pd

# 딕셔너리로 DataFrame 생성
data = {
    '이름': ['김철수', '이영희', '박민수', '정지은'],
    '나이': [25, 30, 35, 28],
    '부서': ['개발', '마케팅', '개발', '인사'],
    '연봉': [4500, 4200, 5800, 4000]
}

df = pd.DataFrame(data)
print(df)

2. CSV 파일에서 불러오기

실무에서는 주로 외부 파일에서 데이터를 불러옵니다.

# CSV 파일 읽기
df = pd.read_csv('sales_data.csv', encoding='utf-8')

# Excel 파일 읽기
df = pd.read_excel('sales_data.xlsx', sheet_name='Sheet1')

DataFrame 기본 탐색

데이터를 불러온 후 가장 먼저 해야 할 일은 데이터의 구조와 내용을 파악하는 것입니다.

주요 탐색 메서드

메서드 설명 용도
head(n) 처음 n개 행 출력 (기본값 5) 데이터 미리보기
tail(n) 마지막 n개 행 출력 데이터 끝부분 확인
info() 데이터 타입, 결측치 정보 전체 구조 파악
describe() 기술통계량 출력 수치형 데이터 요약
shape (행 수, 열 수) 반환 데이터 크기 확인
# 데이터 탐색 예시
print(df.head())          # 상위 5개 행
print(df.info())          # 데이터 타입 및 결측치 정보
print(df.describe())      # 기술통계량
print(f"데이터 크기: {df.shape}")  # (행, 열)

데이터 선택과 필터링

열(Column) 선택

# 단일 열 선택
names = df['이름']

# 여러 열 선택
subset = df[['이름', '부서', '연봉']]

조건 필터링

실무에서 가장 많이 사용하는 기능 중 하나입니다.

# 연봉이 4500 이상인 직원
high_salary = df[df['연봉'] >= 4500]

# 개발 부서 직원
dev_team = df[df['부서'] == '개발']

# 복합 조건 (AND)
dev_senior = df[(df['부서'] == '개발') & (df['나이'] >= 30)]

# 복합 조건 (OR)
dev_or_hr = df[(df['부서'] == '개발') | (df['부서'] == '인사')]

Tip: 조건을 결합할 때는 & (AND), | (OR)를 사용하며, 각 조건을 괄호로 감싸야 합니다.

데이터 집계와 그룹화

기본 집계 함수

# 평균 연봉
avg_salary = df['연봉'].mean()

# 최대/최소 나이
max_age = df['나이'].max()
min_age = df['나이'].min()

# 직원 수
total_count = df['이름'].count()

groupby를 활용한 그룹 집계

groupby는 데이터 분석의 핵심 기능으로, 특정 기준으로 데이터를 그룹화하여 집계할 수 있습니다.

# 부서별 평균 연봉
dept_salary = df.groupby('부서')['연봉'].mean()

# 부서별 여러 통계량
dept_stats = df.groupby('부서').agg({
    '연봉': ['mean', 'min', 'max'],
    '나이': 'mean'
})

print(dept_stats)

실무 활용 예시: 월별 매출 분석

# 날짜 컬럼을 datetime으로 변환
sales_df['날짜'] = pd.to_datetime(sales_df['날짜'])

# 월별 컬럼 추가
sales_df['월'] = sales_df['날짜'].dt.month

# 월별 매출 합계
monthly_sales = sales_df.groupby('월')['매출액'].sum()

# 제품별, 월별 매출 집계
product_monthly = sales_df.groupby(['제품명', '월'])['매출액'].sum()

결측치 처리

실제 데이터에는 종종 누락된 값(NaN)이 존재합니다. 이를 적절히 처리하는 것이 중요합니다.

결측치 확인 및 처리 방법

메서드 설명 사용 시기
isnull() 결측치 여부 확인 결측치 탐색
dropna() 결측치가 있는 행/열 제거 결측치가 소수일 때
fillna() 결측치를 특정 값으로 채우기 결측치 대체 필요시
# 결측치 확인
print(df.isnull().sum())

# 결측치가 있는 행 제거
df_clean = df.dropna()

# 결측치를 평균값으로 채우기
df['연봉'].fillna(df['연봉'].mean(), inplace=True)

# 결측치를 특정 값으로 채우기
df['부서'].fillna('미정', inplace=True)

데이터 정렬 및 순위

# 연봉 기준 내림차순 정렬
df_sorted = df.sort_values('연봉', ascending=False)

# 여러 컬럼 기준 정렬 (부서 오름차순, 연봉 내림차순)
df_multi = df.sort_values(['부서', '연봉'], ascending=[True, False])

# 순위 매기기
df['연봉순위'] = df['연봉'].rank(ascending=False)

새로운 열 추가 및 변환

# 새로운 열 추가 (연봉을 월급으로 환산)
df['월급'] = df['연봉'] / 12

# 조건에 따른 열 생성
df['시니어여부'] = df['나이'].apply(lambda x: '시니어' if x >= 30 else '주니어')

# 여러 조건을 활용한 범주화
def categorize_salary(salary):
    if salary >= 5000:
        return '상'
    elif salary >= 4000:
        return '중'
    else:
        return '하'

df['연봉등급'] = df['연봉'].apply(categorize_salary)

실무 활용 종합 예시

고객 구매 데이터를 분석하는 실제 시나리오입니다.

import pandas as pd

# 데이터 불러오기
purchase_df = pd.read_csv('customer_purchase.csv')

# 1. 데이터 탐색
print(purchase_df.head())
print(purchase_df.info())

# 2. 결측치 처리
purchase_df.dropna(subset=['고객ID', '구매금액'], inplace=True)

# 3. 날짜 변환
purchase_df['구매일시'] = pd.to_datetime(purchase_df['구매일시'])
purchase_df['연도'] = purchase_df['구매일시'].dt.year
purchase_df['월'] = purchase_df['구매일시'].dt.month

# 4. 고객별 구매 통계
customer_stats = purchase_df.groupby('고객ID').agg({
    '구매금액': ['sum', 'mean', 'count'],
    '구매일시': ['min', 'max']
}).reset_index()

# 5. 월별 매출 추이
monthly_revenue = purchase_df.groupby(['연도', '월'])['구매금액'].sum()

# 6. 상위 10% 고객 추출 (VIP 고객)
top_10_threshold = customer_stats['구매금액']['sum'].quantile(0.9)
vip_customers = customer_stats[customer_stats['구매금액']['sum'] >= top_10_threshold]

print(f"VIP 고객 수: {len(vip_customers)}명")

마무리

DataFrame은 데이터 분석의 필수 도구로, 다음과 같은 핵심 기능을 제공합니다:

  1. 데이터 생성 및 불러오기: 딕셔너리, CSV, Excel 등 다양한 방법 지원
  2. 데이터 탐색: head(), info(), describe()로 구조 파악
  3. 선택과 필터링: 조건을 활용한 유연한 데이터 추출
  4. 집계와 그룹화: groupby()로 그룹별 통계 분석
  5. 결측치 처리: dropna(), fillna()로 데이터 품질 관리
  6. 데이터 변환: 새로운 열 생성 및 기존 데이터 가공

DataFrame을 능숙하게 다루면 복잡한 데이터도 쉽게 분석할 수 있습니다. 실제 데이터로 직접 연습하면서 각 메서드의 활용법을 익히는 것이 가장 효과적입니다.

실무에서는 이러한 기본 기능들을 조합하여 인사이트를 도출하고, 데이터 기반 의사결정을 내리게 됩니다. 지금 바로 자신의 데이터로 DataFrame을 활용해보세요!

이 글이 도움이 되셨나요? ☕

Buy me a coffee

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

TODAY 66 | TOTAL 66