Pandas : 데이터프레임 기초부터 병합·결측치 처리·시각화까지

2025. 8. 13. 16:32심화_인공지능 YOLO기반 부트캠프_일기(CNN)

1. 목차 소개

 

 

2. 파이썬 Pandas 라이브러리 소개

파이썬 Pandas는 데이터 분석과 조작에 특화된 라이브러리입니다. 데이터 과학이나 분석 작업을 할 때 매우 유용하게 쓰이는데요, 제가 부트캠프에서 배우면서 느낀 주요 특징들을 간단히 정리해봤습니다.

3. 주요 특징

      1. 데이터 구조
        • Series: 1차원 데이터로, 인덱스를 가지고 있습니다.
        • DataFrame: 2차원 표 형태의 데이터 구조로, 행과 열로 구성되어 있습니다.
      2. 다양한 데이터 입출력 지원
        CSV, 엑셀, SQL 등 여러 형식의 파일을 쉽게 불러오고 저장할 수 있습니다.
      3. 풍부한 데이터 처리 기능
        결측치 처리, 필터링, 정렬, 그룹화, 병합 등 다양한 작업을 손쉽게 할 수 있습니다.
      4. 통계 및 시각화 연동
        기본적인 통계 함수들이 제공되며, matplotlib 같은 시각화 도구와도 잘 연동됩니다.
      5. 빠른 처리 속도
        내부적으로 C로 최적화되어 있어 대용량 데이터도 빠르게 처리할 수 있습니다.

 

4. 데이터프레임 기본 개념과 생성

Pandas의 기본 데이터 구조인 Series와 DataFrame을 만드는 간단한 예제입니다.

import pandas as pd

# Series 생성
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s)

실행 결과
a    10
b    20
c    30
dtype: int64

다음은 데이터 프레임을 만드는 예제 입니다.

# DataFrame 생성
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Score': [85, 90, 95]
}
df = pd.DataFrame(data)
print(df)

실행 결과
      Name  Age  Score
0    Alice   25     85
1      Bob   30     90
2  Charlie   35     95

더 큰 단위로 만들어 보죠!

df_emp = pd.DataFrame({
    '번호': [1001, 1002, 1003, 1004, 1005],
    '이름': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    '부서번호': [10, 20, 10, 30, 40],
    '입사일': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-05', '2023-05-12'],
    '전화': ['123-456-7890', '987-654-3210', '555-123-4567', '111-222-3333', '444-2548-5412']
})
print(df_emp)

구글 코랩에서 실행한 결과

구글 코랩 전체 실행 결과

5. fillna() 함수란?

fillna()는 Pandas에서 결측치(NaN)를 다른 값으로 채워 넣는 함수입니다.
예를 들어, 데이터에 빠진 값이 있을 때 특정 숫자나 계산된 값(평균, 중간값 등)으로 대체할 때 씁니다.

 

df['점수'] = df['점수'].fillna(0)  # 결측치를 0으로 채움

6. mean() 함수란?

mean()은 Pandas에서 해당 컬럼의 평균값을 계산하는 함수입니다.
숫자 데이터의 산술평균(전체 합을 개수로 나눈 값)을 쉽게 구할 수 있어요.

평균값 = df['점수'].mean()

 

7. Pandas로 결측치(NaN) 처리하기 – 평균값으로 대치하기

아래 예제는 점수 데이터 중에 결측치(NaN)가 있을 때, 해당 결측치를 점수의 평균값으로 채우는 방법입니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    '이름': ['홍길동', '김철수', '이영희'],
    '점수': [90, np.nan, 85]
})

print(df)

fillna와 mean을 이용한 결측치 채우기

 

8. duplicated() 함수로 중복 행 확인하기

duplicated()는 DataFrame에서 중복된 행을 찾는 함수입니다.
모든 컬럼 값을 기준으로 이전에 나온 행과 같은 데이터가 있으면 True를 반환하고, 그렇지 않으면 False를 반환해요.

중복된 행을 찾아서 True반환하기

중복된 행은 분석에 방해가 될 수 있으니 보통 제거해 줍니다.

drop_duplicates() 함수는 첫 번째 등장하는 행은 유지하고, 이후 중복된 행들을 삭제해 줍니다.
간단히 중복 데이터를 정리할 때 아주 유용합니다.

 

drop_duplicates() 함수를 사용하면 중복을 제거할 수 있습니다.

drop_duplicates()함수를 이용한 중복 제거

9. Pandas로 데이터프레임 병합과 조인하기

데이터 분석할 때 여러 데이터프레임을 합치는 작업은 매우 자주 하게 됩니다.
Pandas에서는 merge(), concat(), join() 등 다양한 방법을 제공하는데요, 각각의 특징과 사용법을 예제와 함께 살펴보겠습니다.

9.1. merge() — 공통 열 기준으로 병합하기

merge()는 SQL의 JOIN과 비슷하게, 특정 열을 기준으로 두 데이터프레임을 합칠 때 씁니다.

merge로 병합

9.2. concat() — 데이터프레임 이어붙이기 (위아래 또는 옆으로)

concat()은 여러 데이터프레임을 단순히 이어 붙일 때 사용합니다.

인덱스가 중복되는 경우

df1 = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Score': [90, 85]}, index=['s1', 's2'])
df2 = pd.DataFrame({'Name': ['Charlie', 'Bob'], 'Score': [88, 82]}, index=['s2', 's3'])

result = pd.concat([df1, df2])
print(result)

 

concat으로 합치기

 

      • 인덱스 s2가 중복되어 있어도 그대로 합칩니다.

인덱스를 무시하고 합치기

result = pd.concat([df1, df2], ignore_index=True)
print(result)

ignore_index=True로 새 인덱스를 0부터 자동 부여합니다.

 

중복된 인덱스 제거하기

result = pd.concat([df1, df2])
result = result[~result.index.duplicated(keep='first')]
print(result)

~result.index.duplicated(keep='first')는 중복된 인덱스 중 첫 번째만 남기고 제거합니다.

 

인덱스 재설정 후 합치기

df2_reset = df2.reset_index(drop=True)
result = pd.concat([df1, df2_reset], ignore_index=True)
print(result)

reset_index(drop=True)로 인덱스를 초기화해 충돌을 방지합니다.

 

9.3. join() — 인덱스를 기준으로 병합하기

join()은 기본적으로 인덱스를 기준으로 두 데이터프레임을 합칩니다.

df1 = pd.DataFrame({'이름': ['홍길동', '김철수', '이영희'], '수학': [90, 85, 88]}).set_index('이름')
df2 = pd.DataFrame({'이름': ['홍길동', '이영희', '박지민'], '영어': [95, 80, 75]}).set_index('이름')

result = df1.join(df2)
print(result)

      • 기본 how='left' 옵션으로 왼쪽 데이터프레임의 인덱스를 모두 유지합니다.

다양한 join 방식

      • how='inner' : 양쪽 모두에 존재하는 인덱스만 남김
      • how='outer' : 모든 인덱스를 포함, 없는 값은 NaN

컬럼 이름 중복 처리

df3 = pd.DataFrame({'수학': [70, 60, 50]}, index=['홍길동', '김철수', '이영희'])
df1.join(df3, lsuffix='_왼쪽', rsuffix='_오른쪽')

같은 이름 컬럼이 충돌할 때 접미사를 붙여 구분할 수 있습니다.

 

10. Matplotlib으로 시계열 데이터 시각화하기

.

import pandas as pd
import matplotlib.pyplot as plt

url = "https://raw.githubusercontent.com/plotly/datasets/master/tesla-stock-price.csv"
df = pd.read_csv(url)

df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

df_early = df[df.index < '2020-01-01']

plt.figure(figsize=(12, 6))
plt.plot(df_early['close'], label='Close Price (2010~2019)', color='orange')
plt.title('Tesla Close Price (2010~2019)')
plt.xlabel('Date')
plt.ylabel('Price ($)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

 

      • Tesla의 2010~2019년 종가(close) 변화를 시각화했습니다.
      • date를 인덱스로 설정하고 matplotlib으로 간단하게 그래프를 그릴 수 있습니다.