목차
파이썬 pandas 라이브러리 사용 가이드
이 문서는 파이썬의 강력한 데이터 분석 라이브러리인 pandas의 기본적인 사용법을 안내합니다. pandas는 데이터 조작, 분석 및 정리를 위한 고성능의 사용하기 쉬운 데이터 구조와 도구를 제공합니다. 주로 정형 데이터(tabular data)를 다루는 데 사용되며, 스프레드시트나 데이터베이스 테이블과 유사한 방식으로 데이터를 처리할 수 있습니다.
이 가이드에서는 pandas의 설치부터 핵심 데이터 구조 이해, 데이터 불러오기/저장, 그리고 기본적인 데이터 조작 방법에 이르기까지 폭넓은 내용을 다룰 것입니다.
1. pandas 설치
pandas를 사용하기 위해서는 먼저 파이썬 환경에 라이브러리를 설치해야 합니다. 대부분의 경우 pip
를 사용하여 쉽게 설치할 수 있습니다.
1) pip를 이용한 설치
명령 프롬프트(Windows) 또는 터미널(macOS/Linux)을 열고 다음 명령어를 실행합니다.
pip install pandas matplotlib openpyxl
matplotlib
: 데이터 시각화를 위해 함께 설치하는 것이 좋습니다.openpyxl
: Excel 파일을 읽고 쓰기 위해 필요합니다.
2) Anaconda 환경에서의 설치
Anaconda를 사용하는 경우, pandas는 일반적으로 기본 설치에 포함되어 있습니다. 만약 설치되어 있지 않다면, 다음 명령어를 사용할 수 있습니다.
conda install pandas
Anaconda는 데이터 과학 환경을 위한 모든 필수 라이브러리를 미리 포함하고 있어 편리합니다.
2. 핵심 데이터 구조
pandas의 핵심은 두 가지 주요 데이터 구조입니다: Series
와 DataFrame
. 이들은 데이터를 효율적으로 저장하고 조작할 수 있도록 설계되었습니다.
1) Series
Series
는 1차원 배열과 유사한 객체로, 인덱스와 함께 데이터를 저장합니다. 파이썬의 리스트나 NumPy의 배열과 비슷하지만, 각 데이터 포인트에 레이블(인덱스)을 부여할 수 있다는 점에서 차이가 있습니다.
Series 생성
Series
를 생성하는 가장 기본적인 방법은 리스트나 NumPy 배열을 사용하는 것입니다.
import pandas as pd # 리스트로 Series 생성 s1 = pd.Series([1, 3, 5, 7, 9]) print("--- s1 ---") print(s1) # 인덱스를 지정하여 Series 생성 s2 = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd']) print("\n--- s2 ---") print(s2)
결과:
--- s1 --- 0 1 1 3 2 5 3 7 4 9 dtype: int64 --- s2 --- a 10 b 20 c 30 d 40 dtype: int64
Series의 주요 속성 및 연산
s.values
:Series
의 값(데이터)을 NumPy 배열로 반환합니다.s.index
:Series
의 인덱스를 반환합니다.s[index]
: 특정 인덱스의 값에 접근합니다.s.sum()
,s.mean()
: 합계, 평균 등 통계 연산을 수행합니다.
2) DataFrame
DataFrame
은 pandas의 핵심이자 가장 많이 사용되는 데이터 구조입니다. 2차원 테이블 형태로, 행과 열을 가지며 스프레드시트나 데이터베이스 테이블과 매우 유사합니다. 각 열은 다른 데이터 타입을 가질 수 있습니다.
DataFrame 생성
DataFrame
은 딕셔너리, 리스트의 리스트, 또는 NumPy 배열 등 다양한 방법으로 생성할 수 있습니다. 가장 일반적인 방법은 딕셔너리를 사용하는 것입니다.
import pandas as pd # 딕셔너리를 사용하여 DataFrame 생성 data = { '이름': ['철수', '영희', '민수', '수미'], '나이': [25, 30, 28, 22], '도시': ['서울', '부산', '대구', '제주'] } df = pd.DataFrame(data) print("--- df ---") print(df) # 인덱스와 컬럼을 지정하여 생성 df2 = pd.DataFrame(data, index=['a', 'b', 'c', 'd'], columns=['이름', '도시', '나이']) print("\n--- df2 (컬럼 순서 변경) ---") print(df2)
결과:
--- df --- 이름 나이 도시 0 철수 25 서울 1 영희 30 부산 2 민수 28 대구 3 수미 22 제주 --- df2 (컬럼 순서 변경) --- 이름 도시 나이 a 철수 서울 25 b 영희 부산 30 c 민수 대구 28 d 수미 제주 22
DataFrame의 주요 속성 및 연산
DataFrame
은 다양한 속성과 메서드를 제공하여 데이터를 탐색하고 조작할 수 있도록 합니다.
속성/메서드 | 설명 | 반환 타입 |
---|---|---|
df.head(n) | DataFrame 의 상위 n 개 행을 반환 (기본값 5) | DataFrame |
df.tail(n) | DataFrame 의 하위 n 개 행을 반환 | DataFrame |
df.info() | DataFrame 의 요약 정보 (데이터 타입, 결측치 등) | None (출력) |
df.describe() | 숫자형 열에 대한 기술 통계 계산 | DataFrame |
df.shape | DataFrame 의 행과 열 개수 | 튜플 |
df.columns | 열(컬럼) 이름 | Index 객체 |
df.index | 행 인덱스 | Index 객체 |
데이터 선택 및 필터링
DataFrame
에서 특정 열, 행 또는 조건에 맞는 데이터를 선택하는 것은 매우 중요합니다.
- 컬럼 선택:
- 단일 컬럼:
df[컬럼명]
또는df.컬럼명
- 여러 컬럼:
df[[컬럼1, 컬럼2]]
- 행 선택:
loc
(레이블 기반):df.loc[인덱스]
,df.loc[시작인덱스:종료인덱스]
iloc
(정수 위치 기반):df.iloc[0]
,df.iloc[0:3]
- 조건부 선택 (필터링):
df[df[컬럼명] > 값]
import pandas as pd data = { '이름': ['철수', '영희', '민수', '수미', '지훈'], '나이': [25, 30, 28, 22, 35], '도시': ['서울', '부산', '대구', '제주', '서울'], '점수': [85, 92, 78, 95, 88] } df = pd.DataFrame(data) print("--- '나이' 컬럼 선택 ---") print(df['나이']) print("\n--- '이름'과 '점수' 컬럼 선택 ---") print(df[['이름', '점수']]) print("\n--- 인덱스 1번 행 선택 (iloc) ---") print(df.iloc[1]) print("\n--- '나이'가 30 이상인 데이터 필터링 ---") print(df[df['나이'] >= 30]) print("\n--- '도시'가 '서울'인 데이터 필터링 ---") print(df[df['도시'] == '서울'])
결과:
--- '나이' 컬럼 선택 --- 0 25 1 30 2 28 3 22 4 35 Name: 나이, dtype: int64 --- '이름'과 '점수' 컬럼 선택 --- 이름 점수 0 철수 85 1 영희 92 2 민수 78 3 수미 95 4 지훈 88 --- 인덱스 1번 행 선택 (iloc) --- 이름 영희 나이 30 도시 부산 점수 92 Name: 1, dtype: object --- '나이'가 30 이상인 데이터 필터링 --- 이름 나이 도시 점수 1 영희 30 부산 92 4 지훈 35 서울 88 --- '도시'가 '서울'인 데이터 필터링 --- 이름 나이 도시 점수 0 철수 25 서울 85 4 지훈 35 서울 88
컬럼 추가 및 삭제
DataFrame
에 새로운 컬럼을 추가하거나 기존 컬럼을 삭제할 수 있습니다.
- 컬럼 추가:
df[
새 컬럼명] = 값
- 컬럼 삭제:
del df[
컬럼명]
또는df.drop(
컬럼명, axis=1)
import pandas as pd data = { '제품': ['A', 'B', 'C', 'D'], '가격': [1000, 2000, 1500, 2500] } df = pd.DataFrame(data) print("--- 원본 DataFrame ---") print(df) # '재고' 컬럼 추가 df['재고'] = [10, 5, 8, 12] print("\n--- '재고' 컬럼 추가 후 ---") print(df) # '가격' 컬럼 삭제 df_dropped = df.drop('가격', axis=1) # axis=1은 컬럼을 의미 print("\n--- '가격' 컬럼 삭제 후 (원본 유지) ---") print(df_dropped) # 원본 DataFrame에서 '재고' 컬럼을 영구 삭제 # df.drop('재고', axis=1, inplace=True) # inplace=True를 사용하면 원본 변경
결과:
--- 원본 DataFrame --- 제품 가격 0 A 1000 1 B 2000 2 C 1500 3 D 2500 --- '재고' 컬럼 추가 후 --- 제품 가격 재고 0 A 1000 10 1 B 2000 5 2 C 1500 8 3 D 2500 12 --- '가격' 컬럼 삭제 후 (원본 유지) --- 제품 재고 0 A 10 1 B 5 2 C 8 3 D 12
3. 데이터 불러오기 및 저장하기
pandas는 다양한 파일 형식의 데이터를 쉽게 불러오고 저장할 수 있는 기능을 제공합니다.
1) CSV 파일
가장 흔하게 사용되는 데이터 형식 중 하나입니다.
CSV 파일 불러오기
pd.read_csv()
함수를 사용합니다.
import pandas as pd # 예시 CSV 파일 생성 (가상의 'data.csv' 파일) csv_content = """Name,Age,City Alice,24,New York Bob,27,Los Angeles Charlie,22,Chicago """ with open('data.csv', 'w') as f: f.write(csv_content) df_csv = pd.read_csv('data.csv') print("--- 'data.csv' 불러오기 ---") print(df_csv)
결과:
--- 'data.csv' 불러오기 --- Name Age City 0 Alice 24 New York 1 Bob 27 Los Angeles 2 Charlie 22 Chicago
CSV 파일 저장하기
DataFrame.to_csv()
메서드를 사용합니다. index=False
를 설정하여 인덱스가 파일에 저장되지 않도록 하는 것이 일반적입니다.
import pandas as pd data = {'제품': ['A', 'B'], '가격': [100, 200]} df_to_save = pd.DataFrame(data) df_to_save.to_csv('output.csv', index=False) print("--- 'output.csv' 파일이 저장되었습니다. ---") # 'output.csv' 파일 내용 (실제 파일에는 주석이 포함되지 않음): # 제품,가격 # A,100 # B,200
2) Excel 파일
Excel 파일도 pandas로 쉽게 처리할 수 있습니다.
Excel 파일 불러오기
pd.read_excel()
함수를 사용합니다.
import pandas as pd # 예시 Excel 파일 생성 (openpyxl 필요) # 실제 사용 시에는 기존 파일을 사용하거나, pandas로 생성 후 불러옵니다. # from openpyxl import Workbook # wb = Workbook() # ws = wb.active # ws['A1'] = 'Name' # ws['B1'] = 'Score' # ws['A2'] = 'David' # ws['B2'] = 90 # ws['A3'] = 'Eve' # ws['B3'] = 85 # wb.save('scores.xlsx') # df_excel = pd.read_excel('scores.xlsx') # print("--- 'scores.xlsx' 불러오기 ---") # print(df_excel)
Excel 파일 저장하기
DataFrame.to_excel()
메서드를 사용합니다. ExcelWriter
객체를 사용하면 여러 시트에 저장할 수도 있습니다.
import pandas as pd data_sheet1 = {'학생': ['김', '이'], '점수': [80, 90]} data_sheet2 = {'과목': ['수학', '영어'], '평균': [75, 88]} df_sheet1 = pd.DataFrame(data_sheet1) df_sheet2 = pd.DataFrame(data_sheet2) with pd.ExcelWriter('multi_sheet.xlsx') as writer: df_sheet1.to_excel(writer, sheet_name='학생점수', index=False) df_sheet2.to_excel(writer, sheet_name='과목평균', index=False) print("--- 'multi_sheet.xlsx' 파일이 여러 시트로 저장되었습니다. ---")
4. 데이터 조작
pandas는 데이터 분석에 필수적인 다양한 데이터 조작 기능을 제공합니다.
1) 결측치 (Missing Data) 처리
데이터에는 종종 비어있는 값, 즉 결측치(NaN - Not a Number)가 포함될 수 있습니다. pandas는 이를 효과적으로 다룰 수 있는 방법을 제공합니다.
결측치 확인
df.isnull()
: 각 셀이 결측치인지 여부를 나타내는 불리언DataFrame
을 반환합니다.df.isnull().sum()
: 각 컬럼별 결측치의 개수를 반환합니다.
import pandas as pd import numpy as np data = { 'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan] } df_nan = pd.DataFrame(data) print("--- 결측치가 포함된 DataFrame ---") print(df_nan) print("\n--- 결측치 여부 확인 (isnull) ---") print(df_nan.isnull()) print("\n--- 컬럼별 결측치 개수 (isnull().sum()) ---") print(df_nan.isnull().sum())
결과:
--- 결측치가 포함된 DataFrame --- A B C 0 1.0 5.0 9.0 1 2.0 NaN 10.0 2 NaN 7.0 11.0 3 4.0 8.0 NaN --- 결측치 여부 확인 (isnull) --- A B C 0 False False False 1 False True False 2 True False False 3 False False True --- 컬럼별 결측치 개수 (isnull().sum()) --- A 1 B 1 C 1 dtype: int64
결측치 채우기
df.fillna(value)
: 결측치를 특정 값으로 채웁니다.df.fillna(df.mean())
: 결측치를 해당 컬럼의 평균값으로 채웁니다.
import pandas as pd import numpy as np data = { 'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan] } df_nan = pd.DataFrame(data) # 0으로 채우기 df_filled_zero = df_nan.fillna(0) print("--- 결측치를 0으로 채운 후 ---") print(df_filled_zero) # 'B' 컬럼의 결측치를 'B' 컬럼의 평균으로 채우기 df_filled_mean = df_nan.copy() # 원본 유지를 위해 copy() 사용 df_filled_mean['B'] = df_filled_mean['B'].fillna(df_filled_mean['B'].mean()) print("\n--- 'B' 컬럼 결측치를 평균으로 채운 후 ---") print(df_filled_mean)
결과:
--- 결측치를 0으로 채운 후 --- A B C 0 1.0 5.0 9.0 1 2.0 0.0 10.0 2 0.0 7.0 11.0 3 4.0 8.0 0.0 --- 'B' 컬럼 결측치를 평균으로 채운 후 --- A B C 0 1.0 5.000 9.0 1 2.0 6.667 10.0 2 NaN 7.000 11.0 3 4.0 8.000 NaN
결측치 제거
df.dropna()
: 하나라도 결측치가 있는 행을 제거합니다.df.dropna(axis=1)
: 하나라도 결측치가 있는 열을 제거합니다.
import pandas as pd import numpy as np data = { 'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan] } df_nan = pd.DataFrame(data) # 결측치가 있는 행 제거 df_dropped_rows = df_nan.dropna() print("--- 결측치가 있는 행 제거 후 ---") print(df_dropped_rows) # 결측치가 있는 열 제거 df_dropped_cols = df_nan.dropna(axis=1) print("\n--- 결측치가 있는 열 제거 후 ---") print(df_dropped_cols)
결과:
--- 결측치가 있는 행 제거 후 --- A B C 0 1.0 5.0 9.0 --- 결측치가 있는 열 제거 후 --- Empty DataFrame Columns: [] Index: [0, 1, 2, 3]
2) 그룹화 (groupby)
groupby()
메서드는 특정 컬럼의 값에 따라 데이터를 그룹화하고, 각 그룹에 대해 집계(aggregation), 변환(transformation), 필터링(filtration) 등의 연산을 수행할 수 있게 합니다.
import pandas as pd data = { '도시': ['서울', '서울', '부산', '대구', '부산', '서울'], '연도': [2020, 2021, 2020, 2021, 2021, 2020], '판매량': [100, 120, 80, 90, 110, 130] } df_sales = pd.DataFrame(data) print("--- 원본 판매 데이터 ---") print(df_sales) # '도시'별 판매량 합계 계산 city_sales = df_sales.groupby('도시')['판매량'].sum() print("\n--- 도시별 판매량 합계 ---") print(city_sales) # '도시'와 '연도'별 판매량 평균 계산 city_year_sales_avg = df_sales.groupby(['도시', '연도'])['판매량'].mean() print("\n--- 도시 및 연도별 판매량 평균 ---") print(city_year_sales_avg)
결과:
--- 원본 판매 데이터 --- 도시 연도 판매량 0 서울 2020 100 1 서울 2021 120 2 부산 2020 80 3 대구 2021 90 4 부산 2021 110 5 서울 2020 130 --- 도시별 판매량 합계 --- 도시 대구 90 부산 190 서울 350 Name: 판매량, dtype: int64 --- 도시 및 연도별 판매량 평균 --- 도시 연도 대구 2021 90.0 부산 2020 80.0 2021 110.0 서울 2020 115.0 2021 120.0 Name: 판매량, dtype: float64
3) 데이터 병합 및 조인 (merge / join)
여러 DataFrame
을 공통 열(키)을 기준으로 결합하는 기능입니다. SQL의 JOIN과 유사합니다.
pd.merge()
: 가장 유연한 병합 함수입니다. 다양한 조인 방식을 지원합니다 (inner, left, right, outer).
import pandas as pd df1 = pd.DataFrame({ 'ID': [1, 2, 3, 4], '이름': ['철수', '영희', '민수', '수미'] }) df2 = pd.DataFrame({ 'ID': [1, 2, 5, 6], '점수': [85, 90, 70, 95] }) print("--- df1 (학생 정보) ---") print(df1) print("\n--- df2 (학생 점수) ---") print(df2) # ID를 기준으로 내부 조인 (inner join) # 양쪽에 모두 존재하는 ID만 결합 df_merged_inner = pd.merge(df1, df2, on='ID', how='inner') print("\n--- Inner Join (ID 기준) ---") print(df_merged_inner) # ID를 기준으로 왼쪽 조인 (left join) # df1의 모든 ID는 유지하고, df2에 없는 ID는 NaN으로 채움 df_merged_left = pd.merge(df1, df2, on='ID', how='left') print("\n--- Left Join (ID 기준) ---") print(df_merged_left)
결과:
--- df1 (학생 정보) --- ID 이름 0 1 철수 1 2 영희 2 3 민수 3 4 수미 --- df2 (학생 점수) --- ID 점수 0 1 85 1 2 90 2 5 70 3 6 95 --- Inner Join (ID 기준) --- ID 이름 점수 0 1 철수 85 1 2 영희 90 --- Left Join (ID 기준) --- ID 이름 점수 0 1 철수 85.0 1 2 영희 90.0 2 3 민수 NaN 3 4 수미 NaN
결론
이 문서는 파이썬 pandas 라이브러리의 기본적인 사용법에 대한 포괄적인 가이드를 제공했습니다. Series
와 DataFrame
이라는 핵심 데이터 구조를 이해하고, 데이터를 불러오고 저장하는 방법, 그리고 결측치 처리, 그룹화, 데이터 병합과 같은 필수적인 데이터 조작 기술을 살펴보았습니다.
pandas는 데이터 과학 및 분석 분야에서 없어서는 안 될 도구이며, 이 가이드에서 다룬 내용은 시작에 불과합니다. 더 복잡한 데이터 변환, 시계열 분석, 고급 필터링 등 pandas가 제공하는 무궁무진한 기능을 탐색해 보시길 권장합니다. 공식 문서와 다양한 온라인 자료를 통해 꾸준히 학습하는 것이 중요합니다.