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은 데이터 분석의 필수 도구로, 다음과 같은 핵심 기능을 제공합니다:
- 데이터 생성 및 불러오기: 딕셔너리, CSV, Excel 등 다양한 방법 지원
- 데이터 탐색:
head(),info(),describe()로 구조 파악 - 선택과 필터링: 조건을 활용한 유연한 데이터 추출
- 집계와 그룹화:
groupby()로 그룹별 통계 분석 - 결측치 처리:
dropna(),fillna()로 데이터 품질 관리 - 데이터 변환: 새로운 열 생성 및 기존 데이터 가공
DataFrame을 능숙하게 다루면 복잡한 데이터도 쉽게 분석할 수 있습니다. 실제 데이터로 직접 연습하면서 각 메서드의 활용법을 익히는 것이 가장 효과적입니다.
실무에서는 이러한 기본 기능들을 조합하여 인사이트를 도출하고, 데이터 기반 의사결정을 내리게 됩니다. 지금 바로 자신의 데이터로 DataFrame을 활용해보세요!
이 글이 도움이 되셨나요? ☕
Buy me a coffee
답글 남기기