
데이터 분석을 시작하는 많은 사람들이 가장 먼저 배우게 되는 Python 라이브러리 중 하나가 바로 Pandas입니다. 그중에서도 DataFrame은 Pandas의 핵심 데이터 구조로, 엑셀 스프레드시트나 SQL 테이블과 유사한 2차원 데이터를 효율적으로 처리할 수 있게 해줍니다.
이번 포스트에서는 Pandas DataFrame의 기본 개념부터 생성 방법, 그리고 기본적인 데이터 탐색 방법까지 알아보겠습니다.
Pandas DataFrame이란?
Pandas DataFrame은 행과 열로 구성된 2차원 데이터 구조입니다. 각 열은 서로 다른 변수를 나타내며, 각 행은 하나의 데이터 샘플을 의미합니다. 엑셀 시트를 떠올리시면 이해가 쉬울 것입니다.
DataFrame의 주요 특징은 다음과 같습니다:
- 다양한 타입의 데이터를 열(column)별로 저장할 수 있습니다.
- 행 인덱스(row index)와 열 이름(column name)을 가집니다.
- 결측치 처리, 그룹화, 병합 등 다양한 데이터 처리 기능을 제공합니다.
먼저 Pandas를 사용하기 위해 라이브러리를 임포트합니다.
import pandas as pd
DataFrame 생성하기
DataFrame을 생성하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법 몇 가지를 살펴보겠습니다.
Dictionary를 이용한 DataFrame 생성
Python의 사전(dictionary) 자료형을 이용하여 DataFrame을 생성할 수 있습니다. 이 때, 딕셔너리의 키(key)는 DataFrame의 열 이름이 되고, 값(value)은 각 열의 데이터가 됩니다.
# Dictionary를 이용한 DataFrame 생성
df = pd.DataFrame({'KOSPI': [1915, 1961, 2026, 2467, 2041],
'KOSDAQ': [542, 682, 631, 798, 675]})
print(df)
출력 결과:
KOSPI KOSDAQ
0 1915 542
1 1961 682
2 2026 631
3 2467 798
4 2041 675
기본적으로 DataFrame은 0부터 시작하는 정수형 인덱스를 사용합니다. 하지만 필요에 따라 커스텀 인덱스를 지정할 수도 있습니다.
df = pd.DataFrame({'KOSPI': [1915, 1961, 2026, 2467, 2041],
'KOSDAQ': [542, 682, 631, 798, 675]},
index=[2014, 2015, 2016, 2017, 2018])
print(df)
출력 결과:
KOSPI KOSDAQ
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
Series를 이용한 DataFrame 생성
Pandas의 Series 객체는 1차원 배열로, DataFrame의 한 열에 해당합니다. 여러 Series 객체를 결합하여 DataFrame을 생성할 수도 있습니다.
# Series를 이용한 DataFrame 생성
kospi = pd.Series([1915, 1961, 2026, 2467, 2041],
index=[2014, 2015, 2016, 2017, 2018],
name='KOSPI')
print(kospi)
출력 결과:
2014 1915
2015 1961
2016 2026
2017 2467
2018 2041
Name: KOSPI, dtype: int64
kosdaq = pd.Series([542, 682, 631, 798, 675],
index=[2014, 2015, 2016, 2017, 2018],
name='KOSDAQ')
print(kosdaq)
출력 결과:
2014 542
2015 682
2016 631
2017 798
2018 675
Name: KOSDAQ, dtype: int64
Series 객체를 결합하여 DataFrame을 생성할 때는 다음과 같이 합니다:
df = pd.DataFrame({kospi.name: kospi, kosdaq.name: kosdaq})
print(df)
출력 결과:
KOSPI KOSDAQ
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
List를 이용한 DataFrame 생성
리스트(List)를 사용하여 DataFrame을 생성하는 방법도 있습니다. 이 방법은 행 데이터를 리스트로 준비할 때 유용합니다.
columns = ['KOSPI', 'KOSDAQ']
index = [2014, 2015, 2016, 2017, 2018]
rows = []
rows.append([1915, 542])
rows.append([1961, 682])
rows.append([2026, 631])
rows.append([2467, 798])
rows.append([2041, 675])
df = pd.DataFrame(rows, columns=columns, index=index)
print(df)
출력 결과:
KOSPI KOSDAQ
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
DataFrame 기본 정보 확인하기
DataFrame을 생성한 후에는 데이터에 대한 기본 정보를 확인할 수 있는 다양한 메서드가 있습니다.
describe() – 기술 통계량 확인
describe()
메서드는 DataFrame의 수치형 열에 대한 기술 통계량을 계산하여 보여줍니다.
print(df.describe())
출력 결과:
KOSPI KOSDAQ
count 5.000000 5.000000
mean 2082.000000 665.600000
std 221.117616 92.683871
min 1915.000000 542.000000
25% 1961.000000 631.000000
50% 2026.000000 675.000000
75% 2041.000000 682.000000
max 2467.000000 798.000000
이를 통해 각 열의 평균, 표준편차, 최소값, 최대값 등을 한눈에 파악할 수 있습니다.
info() – 데이터 유형 및 결측치 확인
info()
메서드는 DataFrame의 구조, 데이터 유형, 결측치 여부 등을 보여줍니다.
print(df.info())
출력 결과:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 2014 to 2018
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 KOSPI 5 non-null int64
1 KOSDAQ 5 non-null int64
dtypes: int64(2)
memory usage: 120.0 bytes
None
이 정보를 통해 DataFrame의 크기, 열의 데이터 유형, 결측치 개수 등을 확인할 수 있습니다.
DataFrame 순회하기 (Loop)
DataFrame의 데이터를 행별로 처리해야 할 때는 다양한 순회 방법을 사용할 수 있습니다.
인덱스를 이용한 순회
for i in df.index:
print(i, df['KOSPI'][i], df['KOSDAQ'][i])
출력 결과:
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
itertuples() 메서드를 이용한 순회
itertuples()
메서드는 각 행을 네임드 튜플(named tuple) 형태로 반환합니다. 이 방법은 가장 효율적인 순회 방법 중 하나입니다.
for row in df.itertuples(name='KRX'):
print(row)
출력 결과:
KRX(Index=2014, KOSPI=1915, KOSDAQ=542)
KRX(Index=2015, KOSPI=1961, KOSDAQ=682)
KRX(Index=2016, KOSPI=2026, KOSDAQ=631)
KRX(Index=2017, KOSPI=2467, KOSDAQ=798)
KRX(Index=2018, KOSPI=2041, KOSDAQ=675)
네임드 튜플의 속성에 접근하려면 다음과 같이 인덱싱을 사용할 수도 있습니다:
for row in df.itertuples():
print(row[0], row[1], row[2])
출력 결과:
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
iterrows() 메서드를 이용한 순회
iterrows()
메서드는 각 행의 인덱스와 Series 객체를 반환합니다.
for idx, row in df.iterrows():
print(idx, row[0], row[1])
출력 결과:
2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675
참고로, itertuples()
메서드가 iterrows()
메서드보다 더 빠른 성능을 제공하므로 대용량 데이터를 처리할 때는 itertuples()
를 사용하는 것이 좋습니다.
DataFrame의 활용: 주식 데이터 분석 예제
위에서 생성한 KOSPI, KOSDAQ 지수 데이터를 이용하여 간단한 분석을 해보겠습니다.
연도별 증감률 계산하기
# 연도별 증감률 계산
df['KOSPI_증감률'] = df['KOSPI'].pct_change() * 100
df['KOSDAQ_증감률'] = df['KOSDAQ'].pct_change() * 100
print(df)
출력 결과:
KOSPI KOSDAQ KOSPI_증감률 KOSDAQ_증감률
2014 1915 542 NaN NaN
2015 1961 682 2.402089 25.830258
2016 2026 631 3.314635 -7.478006
2017 2467 798 21.766535 26.466719
2018 2041 675 -17.268342 -15.413534
시각화하기
Pandas는 기본적으로 Matplotlib를 활용한 시각화 기능을 제공합니다.
import matplotlib.pyplot as plt
# 한글 폰트 설정 (필요시)
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False
# 지수 추이 그래프
df[['KOSPI', 'KOSDAQ']].plot(kind='line', figsize=(10, 6), marker='o')
plt.title('연도별 KOSPI/KOSDAQ 지수 추이')
plt.ylabel('지수')
plt.grid(True)
plt.show()
# 증감률 비교 그래프
df[['KOSPI_증감률', 'KOSDAQ_증감률']].plot(kind='bar', figsize=(10, 6))
plt.title('연도별 KOSPI/KOSDAQ 증감률 비교')
plt.ylabel('증감률 (%)')
plt.grid(True)
plt.show()
마치며
Pandas DataFrame은 데이터 분석에 있어 필수적인 도구입니다. 이번 포스트에서는 DataFrame의 기본 개념과 생성 방법, 그리고 간단한 데이터 탐색 방법에 대해 알아보았습니다.
DataFrame의 더 많은 기능을 활용하려면 다음과 같은 주제를 추가로 공부해보시기 바랍니다:
- 데이터 필터링 및 선택 (
loc
,iloc
메서드) - 결측치 처리 (
dropna
,fillna
메서드) - 그룹화 및 집계 (
groupby
메서드) - 데이터 병합 (
merge
,concat
함수) - 피벗 테이블 (
pivot_table
함수)
Pandas를 활용하면 복잡한 데이터도 효율적으로 분석할 수 있습니다. 계속해서 실습하며 경험을 쌓아가시길 바랍니다!