사용자 도구

사이트 도구


wiki:it:programming:python:library_pandas

파이썬 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의 핵심은 두 가지 주요 데이터 구조입니다: SeriesDataFrame. 이들은 데이터를 효율적으로 저장하고 조작할 수 있도록 설계되었습니다.


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에서 특정 열, 행 또는 조건에 맞는 데이터를 선택하는 것은 매우 중요합니다.

  • 컬럼 선택:
    1. 단일 컬럼: df[컬럼명] 또는 df.컬럼명
    2. 여러 컬럼: df[[컬럼1, 컬럼2]]
  • 행 선택:
    1. loc (레이블 기반): df.loc[인덱스], df.loc[시작인덱스:종료인덱스]
    2. 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 라이브러리의 기본적인 사용법에 대한 포괄적인 가이드를 제공했습니다. SeriesDataFrame이라는 핵심 데이터 구조를 이해하고, 데이터를 불러오고 저장하는 방법, 그리고 결측치 처리, 그룹화, 데이터 병합과 같은 필수적인 데이터 조작 기술을 살펴보았습니다.

pandas는 데이터 과학 및 분석 분야에서 없어서는 안 될 도구이며, 이 가이드에서 다룬 내용은 시작에 불과합니다. 더 복잡한 데이터 변환, 시계열 분석, 고급 필터링 등 pandas가 제공하는 무궁무진한 기능을 탐색해 보시길 권장합니다. 공식 문서와 다양한 온라인 자료를 통해 꾸준히 학습하는 것이 중요합니다.

wiki/it/programming/python/library_pandas.txt · 마지막으로 수정됨: 저자 syjang0803

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki