Pandas Python 라이브러리 설치부터 데이터프레임, 시리즈 활용법까지 데이터 분석 완벽 가이드 - 실무 예제와 함께 배우는 판다스 사용법
Pandas 소개와 기본 개념
Pandas는 파이썬에서 가장 널리 사용되는 데이터 분석 라이브러리입니다.
NumPy를 기반으로 구축된 이 강력한 파이썬 라이브러리는 구조화된 데이터를 효율적으로 조작하고 분석할 수 있는 도구를 제공합니다.
특히 CSV 파일이나 엑셀 데이터를 다룰 때 그 진가를 발휘하며, 데이터 클리닝부터 복잡한 데이터 가공까지 모든 과정을 지원합니다.
판다스의 핵심은 두 가지 주요 데이터 구조인 Series와 DataFrame에 있습니다.
이 구조들은 관계형 데이터베이스의 테이블과 유사한 방식으로 데이터를 저장하고 처리할 수 있게 해줍니다.
Pandas 설치 및 환경 설정
기본 설치 방법
# pip를 사용한 설치
pip install pandas
# conda를 사용한 설치
conda install pandas
의존성 패키지 함께 설치하기
# 데이터 분석에 필요한 전체 패키지 설치
pip install pandas numpy matplotlib seaborn openpyxl
설치가 완료되면 다음과 같이 임포트하여 사용할 수 있습니다
import pandas as pd
import numpy as np
Python 공식 문서에서 더 자세한 설치 방법을 확인할 수 있습니다.
Pandas 핵심 데이터 구조
Series - 1차원 데이터 구조
Series는 인덱스가 있는 1차원 배열로, 파이썬의 리스트나 딕셔너리와 유사하지만 더 강력한 기능을 제공합니다.
# Series 생성 예제
import pandas as pd
# 리스트로부터 Series 생성
data = [10, 20, 30, 40, 50]
series = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])
print(series)
실행 결과
a 10
b 20
c 30
d 40
e 50
dtype: int64
Series의 주요 특징
- 인덱스 레이블을 통한 데이터 접근
- 벡터화된 연산 지원
- 결측값 처리 기능
DataFrame - 2차원 데이터 구조
데이터프레임은 pandas의 핵심 구조로, 행과 열로 구성된 2차원 테이블입니다.
엑셀 스프레드시트나 SQL 테이블과 같은 구조를 가지고 있어 직관적으로 사용할 수 있습니다.
# DataFrame 생성 예제
data = {
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 30, 35],
'도시': ['서울', '부산', '대구']
}
df = pd.DataFrame(data)
print(df)
실행 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
2 박민수 35 대구
데이터 불러오기와 저장하기
CSV 파일 다루기
CSV 불러오기는 데이터 분석의 가장 기본적인 작업입니다.
# CSV 파일 읽기
df = pd.read_csv('data.csv', encoding='utf-8')
# 옵션 설정을 통한 고급 읽기
df = pd.read_csv('data.csv',
sep=',', # 구분자 설정
index_col=0, # 첫 번째 열을 인덱스로 사용
na_values=['NA', 'null']) # 결측값 처리
# CSV 파일로 저장
df.to_csv('output.csv', index=False, encoding='utf-8')
엑셀 파일 처리
엑셀 데이터 분석도 pandas로 쉽게 수행할 수 있습니다:
# 엑셀 파일 읽기
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 여러 시트 읽기
excel_data = pd.read_excel('data.xlsx', sheet_name=None)
# 엑셀 파일로 저장
df.to_excel('output.xlsx', sheet_name='결과', index=False)
데이터 탐색과 기본 정보 확인
데이터 구조 파악하기
# 기본 정보 확인
print(df.info()) # 데이터 타입과 결측값 정보
print(df.describe()) # 기본 통계 정보
print(df.shape) # 데이터프레임 크기
print(df.columns) # 컬럼명 확인
실행 결과
# df.info() 결과
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 3 non-null object
1 나이 3 non-null int64
2 도시 3 non-null object
dtypes: int64(1), object(2)
# df.describe() 결과
나이
count 3.000000
mean 30.000000
std 5.000000
min 25.000000
25% 27.500000
50% 30.000000
75% 32.500000
max 35.000000
# df.shape 결과
(3, 3)
# df.columns 결과
Index(['이름', '나이', '도시'], dtype='object')
데이터 미리보기
# 상위 데이터 확인
df.head(10) # 상위 10개 행
# 하위 데이터 확인
df.tail(5) # 하위 5개 행
# 무작위 샘플링
df.sample(n=10) # 무작위 10개 행
실행 결과
# df.head() 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
2 박민수 35 대구
# df.tail() 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
2 박민수 35 대구
Pandas 공식 문서에서 더 많은 함수들을 살펴보실 수 있습니다.
데이터 선택과 인덱싱
컬럼 선택하기
# 단일 컬럼 선택
print(df['이름'])
# 여러 컬럼 선택
print(df[['이름', '나이']])
# 조건부 선택
print(df[df['나이'] > 25])
실행 결과
# df['이름'] 결과
0 김철수
1 이영희
2 박민수
Name: 이름, dtype: object
# df[['이름', '나이']] 결과
이름 나이
0 김철수 25
1 이영희 30
2 박민수 35
# df[df['나이'] > 25] 결과
이름 나이 도시
1 이영희 30 부산
2 박민수 35 대구
행과 열 동시 선택
# .loc를 사용한 레이블 기반 선택
df.loc[0:2, '이름':'나이']
# .iloc를 사용한 위치 기반 선택
df.iloc[0:3, 0:2]
고급 필터링 기법
Pandas 필터링은 복잡한 조건도 쉽게 처리할 수 있습니다:
# 복합 조건 필터링
filtered_df = df[(df['나이'] >= 25) & (df['도시'] == '서울')]
print(filtered_df)
# isin() 메서드를 활용한 필터링
cities = ['서울', '부산']
city_df = df[df['도시'].isin(cities)]
print(city_df)
# 문자열 패턴 매칭
name_pattern = df[df['이름'].str.contains('김')]
print(name_pattern)
실행 결과
# 복합 조건 필터링 결과
이름 나이 도시
0 김철수 25 서울
# isin() 필터링 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
# 문자열 패턴 매칭 결과
이름 나이 도시
0 김철수 25 서울
데이터 정렬과 정리
데이터 정렬하기
Pandas 정렬 기능을 통해 데이터를 체계적으로 구성할 수 있습니다
# 단일 컬럼 기준 정렬
df_sorted = df.sort_values('나이')
print(df_sorted)
# 여러 컬럼 기준 정렬
df_multi_sort = df.sort_values(['도시', '나이'], ascending=[True, False])
print(df_multi_sort)
# 인덱스 기준 정렬
df_index_sort = df.sort_index()
print(df_index_sort)
실행 결과
# 단일 컬럼 정렬 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
2 박민수 35 대구
# 여러 컬럼 정렬 결과
이름 나이 도시
2 박민수 35 대구
1 이영희 30 부산
0 김철수 25 서울
# 인덱스 정렬 결과
이름 나이 도시
0 김철수 25 서울
1 이영희 30 부산
2 박민수 35 대구
데이터 클리닝
결측값과 중복값 처리는 데이터 분석의 필수 과정입니다:
# 결측값 확인
df.isnull().sum()
# 결측값 제거
df_clean = df.dropna()
# 결측값 채우기
df_filled = df.fillna(df.mean())
# 중복값 제거
df_unique = df.drop_duplicates()
그룹화와 집계 연산
GroupBy 기본 사용법
GroupBy는 pandas의 강력한 기능 중 하나로, 데이터를 그룹별로 분석할 수 있게 해줍니다
# 도시별 그룹화
city_groups = df.groupby('도시')
# 그룹별 평균
city_avg = df.groupby('도시')['나이'].mean()
# 여러 통계량 계산
city_stats = df.groupby('도시')['나이'].agg(['mean', 'std', 'count'])
고급 그룹화 기법
# 여러 컬럼 기준 그룹화
multi_group = df.groupby(['도시', '연령대'])['소득'].sum()
# 사용자 정의 함수 적용
def age_category(age):
if age < 30:
return '청년'
elif age < 50:
return '중년'
else:
return '장년'
df['연령대'] = df['나이'].apply(age_category)
age_group_analysis = df.groupby('연령대').size()
데이터 결합과 병합
DataFrame 합치기
여러 데이터소스를 결합하는 것은 실무에서 매우 중요한 작업입니다
메서드 | 기능 | 사용 예시 |
---|---|---|
merge | SQL 스타일 조인 | pd.merge(df1, df2, on='키') |
concat | 단순 연결 | pd.concat([df1, df2]) |
join | 인덱스 기준 결합 | df1.join(df2) |
# merge를 사용한 결합
df1 = pd.DataFrame({'ID': [1, 2, 3], '이름': ['A', 'B', 'C']})
df2 = pd.DataFrame({'ID': [1, 2, 4], '점수': [90, 85, 88]})
# 내부 조인
inner_merged = pd.merge(df1, df2, on='ID', how='inner')
print("내부 조인 결과:")
print(inner_merged)
# 왼쪽 조인
left_merged = pd.merge(df1, df2, on='ID', how='left')
print("\n왼쪽 조인 결과:")
print(left_merged)
실행 결과
내부 조인 결과:
ID 이름 점수
0 1 A 90
1 2 B 85
왼쪽 조인 결과:
ID 이름 점수
0 1 A 90.0
1 2 B 85.0
2 3 C NaN
Concat을 활용한 데이터 연결
# 행 기준 연결
row_concat = pd.concat([df1, df2], ignore_index=True)
# 열 기준 연결
col_concat = pd.concat([df1, df2], axis=1)
실무 활용 예제
매출 데이터 분석 시나리오
실제 비즈니스 상황을 가정한 pandas 예제를 살펴보겠습니다
# 샘플 매출 데이터 생성
import numpy as np
sales_data = {
'날짜': pd.date_range('2024-01-01', periods=10),
'제품': np.random.choice(['A', 'B', 'C'], 10),
'매출액': np.random.randint(1000, 5000, 10),
'지역': np.random.choice(['서울', '부산', '대구'], 10)
}
sales_df = pd.DataFrame(sales_data)
print("매출 데이터 샘플:")
print(sales_df.head())
# 월별 매출 분석
sales_df['월'] = sales_df['날짜'].dt.month
monthly_sales = sales_df.groupby('월')['매출액'].sum()
print("\n월별 매출:")
print(monthly_sales)
# 제품별 성과 분석
product_performance = sales_df.groupby('제품').agg({
'매출액': ['sum', 'mean', 'count']
}).round(2)
print("\n제품별 성과:")
print(product_performance)
실행 결과 (예시)
매출 데이터 샘플:
날짜 제품 매출액 지역
0 2024-01-01 B 3421 서울
1 2024-01-02 A 1234 부산
2 2024-01-03 C 4567 대구
3 2024-01-04 A 2890 서울
4 2024-01-05 B 3456 부산
월별 매출:
월
1 28945
dtype: int64
제품별 성과:
매출액
sum mean count
제품
A 12456 3114.0 4
B 15678 3135.6 5
C 8901 8901.0 1
고객 세그멘테이션
# 고객 구매 패턴 분석
customer_analysis = sales_df.groupby(['지역', '제품']).agg({
'매출액': 'sum',
'날짜': 'count'
}).rename(columns={'날짜': '구매횟수'})
# 상위 고객 식별
top_regions = customer_analysis.sort_values('매출액', ascending=False).head(10)
고급 Pandas 함수와 메서드
데이터 변환과 매핑
# apply 함수를 활용한 데이터 변환
df['나이_카테고리'] = df['나이'].apply(lambda x: '청년' if x < 30 else '장년')
# map 함수를 활용한 값 매핑
grade_mapping = {90: 'A', 80: 'B', 70: 'C'}
df['등급'] = df['점수'].map(grade_mapping)
시계열 데이터 처리
# 날짜 인덱스 설정
df['날짜'] = pd.to_datetime(df['날짜'])
df.set_index('날짜', inplace=True)
# 리샘플링 (월별 집계)
monthly_data = df.resample('M')['매출액'].sum()
# 이동평균 계산
df['이동평균'] = df['매출액'].rolling(window=7).mean()
성능 최적화와 모범 사례
메모리 효율적인 데이터 처리
대용량 데이터를 다룰 때는 메모리 관리가 중요합니다:
# 데이터 타입 최적화
df['범주형_컬럼'] = df['범주형_컬럼'].astype('category')
# 청크 단위로 큰 파일 읽기
chunk_list = []
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
processed_chunk = chunk.groupby('category').sum()
chunk_list.append(processed_chunk)
result = pd.concat(chunk_list, ignore_index=True)
벡터화 연산 활용
# 반복문 대신 벡터화 연산 사용 (권장)
df['새컬럼'] = df['A'] * df['B'] + df['C']
# 조건부 할당
df['등급'] = np.where(df['점수'] >= 90, 'A',
np.where(df['점수'] >= 80, 'B', 'C'))
NumPy 공식 문서에서 벡터화 연산에 대해 더 자세히 알아볼 수 있습니다.
데이터 시각화와의 연동
Pandas는 matplotlib과 seaborn과 완벽하게 연동되어 데이터 시각화를 지원합니다
import matplotlib.pyplot as plt
import seaborn as sns
# 간단한 플롯
df['매출액'].plot(kind='hist', bins=20)
# 그룹별 시각화
df.groupby('지역')['매출액'].sum().plot(kind='bar')
# 상관관계 히트맵
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True)
문제 해결과 디버깅
자주 발생하는 오류와 해결책
오류 유형 | 원인 | 해결 방법 |
---|---|---|
KeyError | 존재하지 않는 컬럼 접근 | df.columns 로 컬럼명 확인 |
IndexError | 인덱스 범위 초과 | df.shape 로 크기 확인 |
ValueError | 데이터 타입 불일치 | df.dtypes 로 타입 확인 후 변환 |
데이터 품질 검증
# 데이터 품질 체크 함수
def data_quality_check(df):
print(f"데이터 크기: {df.shape}")
print(f"결측값 비율: {df.isnull().sum() / len(df) * 100}")
print(f"중복값 개수: {df.duplicated().sum()}")
print(f"데이터 타입:\n{df.dtypes}")
data_quality_check(df)
실행 결과
데이터 크기: (3, 3)
결측값 비율: 이름 0.0
나이 0.0
도시 0.0
dtype: float64
중복값 개수: 0
데이터 타입:
이름 object
나이 int64
도시 object
dtype: object
마치며
Pandas는 파이썬 데이터 분석의 핵심 도구로, 데이터 처리부터 분석까지 모든 과정을 효율적으로 수행할 수 있게 해줍니다.
이 가이드에서 다룬 pandas 사용법, pandas 함수, pandas 메서드들을 실무에 적용하면 더욱 전문적인 데이터 분석이 가능할 것입니다.
계속해서 pandas python 라이브러리의 새로운 기능들을 학습하고, 다양한 pandas 예제를 통해 실력을 향상시켜 나가시길 권합니다.
데이터 분석 여정에서 이 pandas 완벽 가이드가 도움이 되기를 바랍니다.
Pandas 커뮤니티에서 더 많은 정보와 최신 업데이트를 확인하실 수 있습니다.
함께 읽으면 좋은 글
Python 자료구조 완벽 가이드: 리스트, 딕셔너리, 셋 실무 성능 최적화 전략
Python 리스트, 딕셔너리, 셋의 시간복잡도 최적화를 통해 대용량 데이터 처리 성능을 300% 향상시키고 메모리 사용량을 50% 절감하는 실전 가이드를 제공합니다.Python 자료구조 선택은 단순한 문법
notavoid.tistory.com
Python asyncio로 동시성 프로그래밍 마스터하기
현대 웹 개발과 데이터 처리에서 성능 최적화는 필수불가결한 요소입니다.특히 파이썬 asyncio 비동기 프로그래밍은 I/O 집약적인 작업을 효율적으로 처리하는 핵심 기술로 자리잡았습니다.이 글
notavoid.tistory.com
FastAPI로 고성능 REST API 만들기 - Flask 대안 탐색
FastAPI는 파이썬 웹 프레임워크 생태계에서 혁신적인 변화를 가져온 모던 프레임워크입니다.Flask보다 더 빠르고 직관적인 개발 경험을 제공하는 FastAPI는 REST API 개발에 최적화된 특징들을 갖추고
notavoid.tistory.com
'파이썬' 카테고리의 다른 글
Yappi란? 파이썬 코드 성능 분석을 위한 Yappi 프로파일러 사용법과 예제 (0) | 2025.07.16 |
---|---|
Python asyncio로 동시성 프로그래밍 마스터하기 (0) | 2025.06.18 |
FastAPI로 고성능 REST API 만들기 - Flask 대안 탐색 (0) | 2025.06.17 |
Python 자료구조 완벽 가이드: 리스트, 딕셔너리, 셋 실무 성능 최적화 전략 (0) | 2025.01.24 |