2026年版: 借地借家法の基本解説

Kwonteki

Kwonteki

2026년 6월 13일

Python의 Pandas 라이브러리: 데이터 분석의 필수 도구

Python의 Pandas 라이브러리: 데이터 분석의 필수 도구

데이터 과학 및 분석의 세계에서 Pandas는 빼놓을 수 없는 핵심 라이브러리입니다. 이 글에서는 Pandas의 기본 개념부터 고급 활용법까지, 실질적인 예제와 함께 자세히 설명하여 여러분의 데이터 분석 능력을 한 단계 끌어올릴 수 있도록 돕겠습니다.

키워드: Pandas, Python, 데이터 분석, DataFrame, Series, 데이터 처리

목차

01Pandas란 무엇인가?

02Pandas 설치 및 기본 설정

03핵심 데이터 구조: Series와 DataFrame

04데이터 불러오기 및 저장하기

05데이터 탐색 및 요약

06데이터 선택 및 필터링

07결측치(Missing Data) 처리

08데이터 정렬 및 순위 매기기

09데이터 그룹화 및 집계

10데이터 병합 및 연결

11시계열 데이터 처리

12성능 최적화 팁

13실전 예제: 판매 데이터 분석

14주의사항 및 고급 팁

Pandas란 무엇인가?

Pandas는 Python 프로그래밍 언어를 위한 오픈 소스 데이터 분석 및 조작 라이브러리입니다. 2008년 AQR Capital Management의 Wes McKinney가 개발을 시작했으며, 데이터 분석가와 과학자들이 데이터를 빠르고 효율적으로 처리하고 분석할 수 있도록 강력하고 유연한 데이터 구조를 제공합니다. Pandas는 특히 구조화된 데이터(테이블 형태의 데이터)를 다루는 데 탁월하며, 데이터 과학 워크플로우의 핵심적인 역할을 수행합니다.

Pandas는 다음과 같은 주요 기능을 제공합니다:

데이터 구조: Series (1차원 배열)와 DataFrame (2차원 테이블)이라는 강력하고 사용하기 쉬운 데이터 구조를 제공합니다.

데이터 불러오기/저장: CSV, Excel, SQL 데이터베이스, JSON 등 다양한 형식의 데이터를 쉽게 읽고 쓸 수 있습니다.

데이터 조작: 데이터 필터링, 선택, 재구성, 병합, 분할, 집계 등 복잡한 데이터 조작 작업을 간편하게 수행할 수 있습니다.

결측치 처리: 누락된 데이터를 식별하고 채우거나 제거하는 기능을 제공합니다.

시계열 기능: 날짜 범위 생성, 빈도 변환, 이동 창 통계 등 시계열 데이터 분석에 특화된 기능을 제공합니다.

통합: NumPy, SciPy, Matplotlib, Scikit-learn 등 다른 Python 라이브러리와 잘 통합됩니다.

포인트: Pandas는 데이터 과학 생태계에서 사실상의 표준으로 자리 잡고 있으며, 복잡한 데이터를 다루는 데 필수적인 도구입니다.

Pandas 설치 및 기본 설정

Pandas를 사용하기 위해서는 먼저 설치해야 합니다. Python 패키지 관리자인 pip를 사용하여 간단하게 설치할 수 있습니다. Anaconda 환경을 사용한다면, Pandas는 기본적으로 포함되어 있을 가능성이 높습니다.

코드 설명

터미널 또는 명령 프롬프트에서 다음 명령어를 실행하여 Pandas를 설치할 수 있습니다.

pip install pandas

설치가 완료되면 Python 스크립트나 Jupyter Notebook에서 다음과 같이 Pandas를 임포트하여 사용할 수 있습니다. 일반적으로 ‘pd’라는 별칭을 사용합니다.

코드 설명

Python 코드 상단에 이 줄을 추가하여 Pandas 라이브러리를 불러옵니다.

import pandas as pd

포인트: Pandas 설치는 pip 명령 하나로 간단하게 완료됩니다. 이후 ‘import pandas as pd’로 라이브러리를 불러와 사용합니다.

핵심 데이터 구조: Series와 DataFrame

Pandas의 핵심은 두 가지 데이터 구조인 SeriesDataFrame입니다. 이들은 데이터를 효율적으로 저장하고 조작하는 데 사용됩니다.

Series

Series는 1차원 배열과 유사한 데이터 구조로, 각 요소에 대한 레이블(인덱스)을 가질 수 있습니다. NumPy 배열과 유사하지만, 인덱스를 통해 데이터에 접근할 수 있다는 점이 다릅니다.

포인트: Series는 인덱스가 있는 1차원 배열이며, NumPy 배열의 확장 버전으로 생각할 수 있습니다.

Series 생성 예시:

코드 설명

Python 리스트를 사용하여 Series를 생성합니다. 인덱스는 자동으로 생성되지만, 명시적으로 지정할 수도 있습니다.

import pandas as pd

data = [10, 20, 30, 40, 50]
s = pd.Series(data)
print(s)

# 사용자 정의 인덱스 사용
s_custom_index = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])
print(s_custom_index)

DataFrame

DataFrame은 2차원 테이블 형태의 데이터 구조로, 여러 개의 Series가 모여 행과 열을 이룹니다. 스프레드시트나 SQL 테이블과 유사하며, Pandas에서 가장 많이 사용되는 구조입니다. 각 열은 고유한 이름을 가지며, 행은 인덱스를 가집니다.

포인트: DataFrame은 행과 열을 가진 표 형태의 데이터 구조로, 여러 Series의 모음입니다.

DataFrame 생성 예시:

코드 설명

딕셔너리를 사용하여 DataFrame을 생성합니다. 딕셔너리의 키는 열 이름이 되고, 값은 해당 열의 데이터가 됩니다.

import pandas as pd

data = {
    '이름': ['Alice', 'Bob', 'Charlie', 'David'],
    '나이': [25, 30, 35, 40],
    '도시': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print(df)

DataFrame은 다양한 방식으로 생성될 수 있으며, 데이터 분석에서 가장 중요한 역할을 합니다.

데이터 불러오기 및 저장하기

실제 데이터 분석에서는 외부 파일을 읽어와 작업하는 경우가 많습니다. Pandas는 다양한 파일 형식을 지원하며, 데이터를 쉽게 불러오고 저장할 수 있는 함수들을 제공합니다.

CSV 파일 읽기 및 쓰기

CSV(Comma Separated Values)는 가장 흔하게 사용되는 데이터 파일 형식 중 하나입니다. Pandas는 read_csv() 함수로 CSV 파일을 읽고, to_csv() 함수로 데이터를 CSV 파일로 저장할 수 있습니다.

포인트: read_csv()to_csv()는 Pandas에서 가장 빈번하게 사용되는 데이터 입출력 함수입니다.

CSV 파일 읽기 예시:

코드 설명

‘data.csv’ 파일을 읽어 DataFrame으로 저장합니다. 첫 번째 행이 헤더로 자동 인식됩니다.

import pandas as pd

df_read = pd.read_csv('data.csv')
print(df_read.head())

CSV 파일 저장 예시:

코드 설명

현재 DataFrame ‘df_to_save’를 ‘output.csv’ 파일로 저장합니다. index=False 옵션은 DataFrame의 인덱스를 파일에 포함시키지 않도록 합니다.

df_to_save = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_to_save.to_csv('output.csv', index=False)

Excel 파일 읽기 및 쓰기

Excel 파일(.xls, .xlsx)도 Pandas로 쉽게 다룰 수 있습니다. read_excel() 함수와 to_excel() 함수를 사용합니다. Excel 파일을 읽기 위해서는 openpyxl 또는 xlrd와 같은 추가 라이브러리가 필요할 수 있습니다.

코드 설명

‘data.xlsx’ 파일의 첫 번째 시트(sheet_name=0)를 읽어옵니다. 특정 시트 이름을 지정할 수도 있습니다.

# Excel 파일을 읽기 위한 라이브러리 설치 (필요시)
# pip install openpyxl

df_excel = pd.read_excel('data.xlsx', sheet_name=0)
print(df_excel.head())

Excel 파일 저장 예시:

코드 설명

DataFrame ‘df_to_excel’을 ‘output.xlsx’ 파일로 저장합니다. index=False는 인덱스를 저장하지 않습니다.

df_to_excel = pd.DataFrame({'colA': [11, 22], 'colB': [33, 44]})
df_to_excel.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

포인트: Excel 파일 작업 시에는 openpyxl 같은 추가 라이브러리 설치가 필요할 수 있습니다.

이 외에도 Pandas는 read_json(), read_sql() 등 다양한 데이터 소스로부터 데이터를 읽어오는 함수를 지원합니다.

데이터 탐색 및 요약

데이터를 불러온 후에는 데이터의 전반적인 특성을 파악하기 위해 탐색하고 요약하는 과정이 필수적입니다. Pandas는 이러한 작업을 위한 여러 유용한 메서드를 제공합니다.

데이터의 처음과 끝 확인

head() 메서드는 DataFrame의 처음 5개 행을 보여주고, tail() 메서드는 마지막 5개 행을 보여줍니다. 행 수를 지정할 수도 있습니다.

코드 설명

DataFrame ‘df’의 처음 3개 행과 마지막 2개 행을 출력합니다.

print(df.head(3))
print(df.tail(2))

포인트: head()tail()은 데이터의 구조를 빠르게 파악하는 데 유용합니다.

데이터 정보 요약

info() 메서드는 DataFrame의 각 열에 대한 정보(데이터 타입, non-null 값의 개수 등)를 요약하여 보여줍니다. describe() 메서드는 수치형 열에 대한 기술 통계량(개수, 평균, 표준편차, 최소값, 최대값, 사분위수 등)을 제공합니다.

코드 설명

DataFrame ‘df’의 기본 정보와 기술 통계량을 출력합니다.

print(df.info())
print(df.describe())

포인트: info()로 데이터 타입과 누락값 여부를, describe()로 수치 데이터의 분포를 빠르게 파악할 수 있습니다.

shape 속성은 DataFrame의 (행, 열) 크기를 튜플 형태로 반환합니다.

코드 설명

DataFrame ‘df’의 행과 열의 개수를 출력합니다.

print(df.shape)

이 외에도 value_counts() (Series의 고유값별 빈도수 계산), nunique() (고유값 개수) 등 다양한 탐색 메서드가 있습니다.

데이터 선택 및 필터링

Pandas에서는 특정 조건에 맞는 데이터를 선택하거나 필터링하는 것이 매우 중요합니다. 이를 위해 다양한 인덱싱 및 선택 방법을 제공합니다.

열(Column) 선택

DataFrame에서 특정 열을 선택하는 가장 쉬운 방법은 [] 연산자나 점(.) 표기법을 사용하는 것입니다. [] 연산자는 열 이름이 변수명으로 유효하지 않거나 공백이 포함된 경우에도 사용할 수 있어 더 일반적입니다.

코드 설명

DataFrame ‘df’에서 ‘이름’ 열과 ‘나이’ 열을 선택합니다. 여러 열을 선택하려면 리스트 형태로 전달합니다.

# [] 연산자 사용
names = df['이름']
ages = df['나이']

# 여러 열 선택 (리스트 전달)
name_and_age = df[['이름', '나이']]

print(names.head())
print(name_and_age.head())

포인트: 단일 열 선택은 Series를 반환하고, 다중 열 선택은 DataFrame을 반환합니다.

행(Row) 선택: loc와 iloc

Pandas는 레이블 기반 인덱싱인 loc와 정수 위치 기반 인덱싱인 iloc를 제공하여 행을 선택할 수 있습니다. 이 두 가지는 DataFrame을 다룰 때 매우 중요합니다.

loc (Label-based indexing)

loc는 인덱스 레이블을 사용하여 데이터를 선택합니다. 행 레이블과 열 레이블 모두 지정할 수 있습니다.

코드 설명

인덱스 레이블이 0인 행의 ‘이름’ 열 값을 선택합니다.

print(df.loc[0, '이름'])

인덱스 레이블 범위를 사용하여 여러 행과 열을 선택할 수도 있습니다. 이때 슬라이싱의 끝 인덱스도 포함됩니다.

코드 설명

인덱스 0부터 2까지의 행과 ‘이름’, ‘도시’ 열을 선택합니다. (0, 1, 2 행 포함)

print(df.loc[0:2, ['이름', '도시']])

iloc (Integer-location based indexing)

iloc는 정수 위치(0부터 시작하는 인덱스)를 사용하여 데이터를 선택합니다. Python의 기본 슬라이싱 동작과 유사합니다.

코드 설명

0번째 행, 0번째 열의 값을 선택합니다. (첫 번째 행, 첫 번째 열)

print(df.iloc[0, 0])

정수 위치 슬라이싱을 사용하여 여러 행과 열을 선택할 수 있습니다. 슬라이싱의 끝 인덱스는 포함되지 않습니다 (Python 기본 슬라이싱과 동일).

코드 설명

0번째부터 2번째 행까지 (0, 1행) 그리고 0번째와 1번째 열을 선택합니다.

print(df.iloc[0:2, [0, 1]])

포인트: loc는 레이블, iloc는 위치 기반으로 데이터를 선택합니다. 슬라이싱 동작에 차이가 있으니 주의해야 합니다.

조건 기반 필터링

특정 조건을 만족하는 행만 추출하는 것은 데이터 분석의 핵심입니다. 불리언(Boolean) 인덱싱을 사용하여 이를 수행합니다.

코드 설명

‘나이’ 열의 값이 30 이상인 행만 선택합니다. df['나이'] >= 30은 각 행에 대해 True/False 값을 반환하는 Series를 생성합니다.

older_than_30 = df[df['나이'] >= 30]
print(older_than_30)

여러 조건을 조합할 수도 있습니다. 이때 각 조건은 괄호로 묶고, 논리 연산자 & (AND), | (OR)를 사용해야 합니다. and, or는 사용할 수 없습니다.

코드 설명

‘나이’가 30 이상이고 ‘도시’가 ‘New York’ 또는 ‘Chicago’인 행을 선택합니다.

filtered_df = df[(df['나이'] >= 30) & ( (df['도시'] == 'New York') | (df['도시'] == 'Chicago') )]
print(filtered_df)

포인트: 불리언 인덱싱은 Pandas에서 데이터를 필터링하는 강력한 방법입니다. 논리 연산자 &| 사용에 유의해야 합니다.

결측치(Missing Data) 처리

실제 데이터는 종종 누락된 값(결측치)을 포함하고 있습니다. Pandas는 결측치를 식별하고 처리하는 다양한 방법을 제공하여 데이터 분석의 정확성을 높입니다.

결측치 식별

Pandas에서는 결측치를 NaN (Not a Number)으로 표현합니다. isnull() 또는 isna() 메서드를 사용하여 DataFrame의 각 요소가 결측치인지 여부를 True/False 값으로 확인할 수 있습니다. notnull() 또는 notna()는 반대로 결측치가 아닌 경우 True를 반환합니다.

코드 설명

DataFrame ‘df_missing’의 각 요소가 결측치인지 여부를 True/False로 표시합니다.

# 예시를 위한 DataFrame 생성 (결측치 포함)
import numpy as np
data_missing = {
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, 11, 12]
}
df_missing = pd.DataFrame(data_missing)

print(df_missing.isnull())

결측치의 총 개수를 확인하려면 sum() 메서드를 함께 사용할 수 있습니다. 각 열별 결측치 개수를 알기 위해 isnull().sum()을 사용합니다.

코드 설명

각 열(A, B, C)에 포함된 결측치의 개수를 출력합니다.

print(df_missing.isnull().sum())

포인트: isnull().sum()은 데이터셋의 결측치 현황을 파악하는 데 매우 유용한 조합입니다.

결측치 제거 (Dropping)

dropna() 메서드는 결측치가 포함된 행이나 열을 제거합니다. axis 매개변수로 행(0 또는 ‘index’) 또는 열(1 또는 ‘columns’)을 지정할 수 있으며, how 매개변수로 ‘any’ (하나라도 결측치면 제거) 또는 ‘all’ (모두 결측치면 제거)을 지정할 수 있습니다. 기본값은 axis=0, how='any'입니다.

코드 설명

결측치가 하나라도 포함된 행을 제거한 새로운 DataFrame을 반환합니다.

df_dropped_rows = df_missing.dropna()
print(df_dropped_rows)

코드 설명

결측치가 하나라도 포함된 열을 제거합니다. (이 예에서는 ‘A’와 ‘B’ 열이 제거됩니다.)

df_dropped_cols = df_missing.dropna(axis=1)
print(df_dropped_cols)

포인트: dropna()는 데이터를 영구적으로 제거하므로, 원본 데이터를 보존하려면 새로운 변수에 할당하거나 inplace=True 옵션을 사용해야 합니다 (단, inplace=True는 권장되지 않음).

결측치 대체 (Filling)

결측치를 제거하는 대신, 특정 값으로 대체하는 것이 더 나은 경우가 많습니다. fillna() 메서드를 사용하여 결측치를 채울 수 있습니다. 채울 값으로는 상수(0, 평균값, 중앙값 등) 또는 이전/이후 값 등을 사용할 수 있습니다.

코드 설명

모든 결측치를 0으로 채웁니다.

df_filled_zero = df_missing.fillna(0)
print(df_filled_zero)

평균값으로 결측치를 대체하는 것은 수치 데이터에서 흔히 사용되는 방법입니다.

코드 설명

각 열의 평균값으로 해당 열의 결측치를 채웁니다. df_missing.mean()은 각 열의 평균값을 Series로 반환합니다.

mean_values = df_missing.mean()
df_filled_mean = df_missing.fillna(mean_values)
print(df_filled_mean)

method='ffill' (forward fill)은 이전 값으로 결측치를 채우고, method='bfill' (backward fill)은 다음 값으로 결측치를 채웁니다.

코드 설명

결측치를 이전 행의 값으로 채웁니다.

df_filled_ffill = df_missing.fillna(method='ffill')
print(df_filled_ffill)

포인트: 결측치 처리 방법(제거 또는 대체)은 데이터의 특성과 분석 목적에 따라 신중하게 결정해야 합니다. fillna()는 다양한 전략을 제공합니다.

데이터 정렬 및 순위 매기기

데이터를 특정 열의 값을 기준으로 정렬하거나 순위를 매기는 것은 데이터의 패턴을 이해하고 중요한 정보를 추출하는 데 필수적입니다. Pandas는 sort_values()rank() 메서드를 제공합니다.

데이터 정렬 (Sorting)

sort_values() 메서드를 사용하여 DataFrame을 하나 이상의 열을 기준으로 정렬할 수 있습니다. by 매개변수에 정렬 기준이 될 열 이름을 지정하고, ascending 매개변수로 오름차순(True, 기본값) 또는 내림차순(False)을 설정합니다.

코드 설명

DataFrame ‘df’를 ‘나이’ 열을 기준으로 오름차순 정렬합니다.

df_sorted_age = df.sort_values(by='나이')
print(df_sorted_age)

여러 열을 기준으로 정렬할 수도 있습니다. by에 열 이름 리스트를 전달하고, ascending에도 Boolean 값 리스트를 전달하여 각 열별 정렬 방식을 지정할 수 있습니다.

코드 설명

먼저 ‘도시’ 열을 기준으로 오름차순 정렬하고, 같은 도시 내에서는 ‘나이’를 기준으로 내림차순 정렬합니다.

df_sorted_multi = df.sort_values(by=['도시', '나이'], ascending=[True, False])
print(df_sorted_multi)

포인트: sort_values()는 데이터의 순서를 재배열하여 특정 기준에 따른 패턴을 쉽게 확인할 수 있게 해줍니다.

순위 매기기 (Ranking)

rank() 메서드는 Series의 각 값에 대한 순위를 계산합니다. 기본적으로 동점인 경우 평균 순위를 부여합니다 (method='average'). ascending 매개변수로 순위 계산 방식을 조정할 수 있습니다.

코드 설명

‘나이’ 열의 값들에 대한 순위를 계산하여 새로운 열 ‘나이_순위’로 추가합니다. 값이 작을수록 순위가 높게 매겨집니다 (오름차순).

df['나이_순위'] = df['나이'].rank()
print(df)

동점 처리 방식(method)과 순위 계산 방향(ascending)을 다양하게 설정할 수 있습니다.