Python Pandas DataFrame 기초부터 활용까지

Python

데이터 분석을 시작하는 많은 사람들이 가장 먼저 배우게 되는 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를 활용하면 복잡한 데이터도 효율적으로 분석할 수 있습니다. 계속해서 실습하며 경험을 쌓아가시길 바랍니다!

참고 자료

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤