본문 바로가기

파이썬

7. 데이터전처리

수치형 데이터 전처리

나이 데이터를 구간화하기

import pandas as pd

# 데이터 생성
data = {'Age': [15, 22, 35, 50, 72]}
df = pd.DataFrame(data)

# 나이를 구간화 (10대, 20대, 30대, ...)
bins = [0, 20, 40, 60, 80]  # 구간 경계 설정
labels = ['10대', '20대', '30대', '40대 이상']  # 각 구간의 이름
df['Age_Group'] = pd.cut(df['Age'], bins=bins, labels=labels)

# 결과 출력
print(df)

 

구간화를 자동으로 수행하기

# 나이를 자동으로 3개의 구간으로 나누기
df['Age_Quantile'] = pd.qcut(df['Age'], q=3, labels=['하위', '중위', '상위'])
# 결과 출력
print(df)

 

MinMaxScaler를 사용한 정규화

from sklearn.preprocessing import MinMaxScaler
import pandas as pd

# 데이터 생성
data = {'Height': [150, 160, 170, 180, 190]}
df = pd.DataFrame(data)

# MinMaxScaler 적용
scaler = MinMaxScaler()
df['Height_Normalized'] = scaler.fit_transform(df[['Height']])

# 결과 출력
print(df)

 

StandardScaler를 사용한 표준화

from sklearn.preprocessing import StandardScaler
import pandas as pd

# 데이터 생성
data = {'Weight': [50, 60, 70, 80, 90]}
df = pd.DataFrame(data)

# StandardScaler 적용
scaler = StandardScaler()
df['Weight_Standardized'] = scaler.fit_transform(df[['Weight']])

# 결과 출력
print(df)

 

스케일링 전체코드

import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 데이터 생성
data = {'Age': [15, 22, 35, 50, 72], 'Weight': [50, 60, 70, 80, 90]}
df = pd.DataFrame(data)

# 구간화
bins = [0, 20, 40, 60, 80]
labels = ['10대', '20대', '30대', '40대 이상']
df['Age_Group'] = pd.cut(df['Age'], bins=bins, labels=labels)

# 정규화
minmax_scaler = MinMaxScaler()
df['Weight_Normalized'] = minmax_scaler.fit_transform(df[['Weight']])

# 표준화
std_scaler = StandardScaler()
df['Weight_Standardized'] = std_scaler.fit_transform(df[['Weight']])
print(df)

 

범주형 데이터 전처리

레이블 인코딩

import pandas as pd
from sklearn.preprocessing import LabelEncoder  # 레이블 인코딩을 위한 라이브러리

# 데이터 생성
data = {'City': ['서울', '부산', '대구', '서울', '부산']}
df = pd.DataFrame(data)

# 레이블 인코딩
encoder = LabelEncoder()  # 레이블 인코더 생성
df['City_Encoded'] = encoder.fit_transform(df['City'])  # 범주형 데이터를 숫자로 변환
# 결과 출력
print(df)

 

원핫인코딩

import pandas as pd

# 데이터 생성
data = {'City': ['서울', '부산', '대구', '서울', '부산']}
df = pd.DataFrame(data)
# 원핫 인코딩
df_encoded = pd.get_dummies(df, columns=['City'])  # City 열을 원핫 인코딩

# 결과 출력
print(df_encoded)


import pandas as pd
heart_data = pd.read_csv("datasets/heart.csv")
heart_data.columns
print(heart_data.head(4))

 

데이터 삭제

기존데이터삭제 : 특정 열 삭제

# 특정 열 삭제 (예: 'Score' 열 삭제)
df_dropped = df.drop(columns=['Score'])

print("특정 열 삭제 후 데이터:")
print(df_dropped)

 

기존데이터삭제 : 결측치가 많은 행 삭제

# 결측치가 있는 데이터 생성
data_with_na = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
                'Age': [25, None, 35, 40],
                'Score': [90, 85, None, 60]}
df_with_na = pd.DataFrame(data_with_na)

# 결측치가 포함된 행 삭제
df_cleaned = df_with_na.dropna()
print("결측치가 포함된 행 삭제 후 데이터:")
print(df_cleaned)

 

기존 데이터삭제 : 중복 데이터 삭제

# 중복 데이터 생성
data_with_duplicates = {'Name': ['Alice', 'Bob', 'Alice', 'David'],
                        'Age': [25, 30, 25, 40],
                        'Score': [90, 85, 90, 60]}
df_with_duplicates = pd.DataFrame(data_with_duplicates)

# 중복된 행 삭제
df_unique = df_with_duplicates.drop_duplicates()

print("중복 데이터 삭제 후 데이터:")
print(df_unique)

 

기존 데이터 삭제

import pandas as pd

# 데이터 생성
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
        'Age': [25, None, 35, 40, 29],
        'Score': [90, 85, 75, 60, 85]}
df = pd.DataFrame(data)

# 1. 특정 행 삭제 (예: 인덱스 1번 삭제)
df = df.drop(index=1)

# 2. 특정 열 삭제 (예: 'Score' 열 삭제)
df = df.drop(columns=['Score'])

# 3. 결측치가 포함된 행 삭제
df = df.dropna()
print("정제된 데이터:")
print(df)

 

컬럼명 변경

컬럼명 변경

import pandas as pd
# 데이터 로드
file_path = "datasets/heart.csv"
df = pd.read_csv(file_path)
# 컬럼명 출력
print("컬럼명 확인:")
print(df.columns)


방법 1: rename() 메서드로 특정 컬럼명 변경

# 특정 컬럼명 변경
df.rename(columns={'age': '나이', 'sex': '성별', 'cp': '흉통유형'}, inplace=True)
# 변경 후 컬럼명 확인
print("변경된 컬럼명 (일부 변경):")
print(df.columns)


방법 2: columns 속성으로 전체 컬럼명 변경

# 전체 컬럼명 변경
df.columns = ['나이', '성별', '흉통유형', '안정시혈압', '콜레스테롤', '공복혈당', '심전도',
              '최대심박수', '운동유발협심증', 'ST우울증', '운동후ST경사', '주요혈관수',
              '결함유형', '심장질환여부']
# 변경 후 컬럼명 확인
print("변경된 컬럼명 (전체 변경):")
print(df.columns)

# 변경 후 데이터 확인
print("변경된 데이터 상위 5개 행:")
df.head()

데이터 정렬

import pandas as pd

# 데이터 로드
file_path = "datasets/heart.csv"
df = pd.read_csv(file_path)

# 데이터 확인
print("원본 데이터:")
df.head()



특정 열 기준으로 정렬하기

# 나이(age) 기준으로 오름차순 정렬
df_sorted_by_age = df.sort_values(by='age', ascending=True)

# 정렬된 데이터 확인
print("나이(age) 기준 오름차순 정렬:")
df_sorted_by_age.head()


여러 열 기준으로 정렬하기

# 나이(age)와 최대심박수(thalachh) 기준으로 정렬
df_sorted_by_multiple = df.sort_values(by=['age', 'thalachh'], ascending=[True, False])

# 정렬된 데이터 확인
print("나이(age)와 최대심박수(thalachh) 기준 정렬:")
df_sorted_by_multiple.head()


인덱스 기준으로 정렬하기

# 인덱스 기준으로 정렬
df_sorted_by_index = df.sort_index(ascending=False)

# 정렬된 데이터 확인
print("인덱스 기준 내림차순 정렬:")


열 이름 기준으로 정렬하기
print("열 이름 기준 오름차순 정렬 전:")
df.head()

# 열 이름 기준으로 오름차순 정렬
df_sorted_by_columns = df.sort_index(axis=1, ascending=True)

# 정렬된 데이터 확인
print("열 이름 기준 오름차순 정렬 후:")
df_sorted_by_columns.head()
df_sorted_by_index.head()

 

데이터 구조 변경

import pandas as pd
# 데이터 로드
file_path = "datasets/heart.csv"
df = pd.read_csv(file_path)
# 컬럼명 변경
df.columns = ['나이', '성별', '흉통유형', '안정시혈압', '콜레스테롤', '공복혈당', '심전도',
              '최대심박수', '운동유발협심증', 'ST우울증', '운동후ST경사', '주요혈관수',
              '결함유형', '심장질환여부']
# 데이터 확인
print("변경된 데이터프레임 컬럼명:")
print(df.columns)
print("\n데이터 상위 5개 행:")
print(df.head())

 

데이터 그룹화와 집계 (group by)

# 성별을 기준으로 데이터 그룹화
grouped = df.groupby('성별')

# 그룹별 데이터 확인
print("그룹화된 데이터 (성별 기준):")
grouped.size()  # 각 그룹의 행 개수 출력


# 성별별 평균 계산
grouped_mean = grouped.mean()

# 그룹화 후 평균값 출력
print("\n성별별 주요 열의 평균:")
print(grouped_mean)

# 성별별 최대값과 최소값 계산
grouped_stats = grouped.agg({
    '나이': ['max', 'min'],  # 나이의 최대값과 최소값
    '콜레스테롤': ['mean', 'std']  # 콜레스테롤의 평균과 표준편차
})
# 결과 출력
print("\n성별별 나이와 콜레스테롤 통계:")
grouped_stats

# 성별과 흉통유형을 기준으로 그룹화
grouped_multi = df.groupby(['성별', '흉통유형']).mean()
# 결과 출력
print("\n성별과 흉통유형별 주요 열의 평균:")
grouped_multi

 

피벗테이블

import pandas as pd
# 데이터 로드
file_path = "datasets/heart.csv"
df = pd.read_csv(file_path)
# 컬럼명 변경
df.columns = ['나이', '성별', '흉통유형', '안정시혈압', '콜레스테롤', '공복혈당', '심전도',
              '최대심박수', '운동유발협심증', 'ST우울증', '운동후ST경사', '주요혈관수',
              '결함유형', '심장질환여부']
              
              
# 피벗테이블 생성
pivot = df.pivot_table(index='성별', columns='흉통유형', values='최대심박수', aggfunc='mean')
# 결과 출력
print("성별과 흉통유형별 평균 최대심박수:")
pivot

# 피벗테이블 생성
pivot_multi_agg = df.pivot_table(index='성별', columns='흉통유형', values='최대심박수', aggfunc=['mean', 'max'])

# 결과 출력
print("\n성별과 흉통유형별 평균 및 최대값:")
pivot_multi_agg


# 피벗테이블 생성
pivot_multi_index = df.pivot_table(index=['성별', '흉통유형'], values='최대심박수', aggfunc='mean')

# 결과 출력
print("\n성별과 흉통유형을 인덱스로 한 피벗테이블:")
pivot_multi_index

import pandas as pd

# 데이터 생성
data = {
    '성별': ['남성', '여성', '남성', '여성'],
    '흉통유형': [1, 2, 3, 1],
    '최대심박수': [150, 160, 155, 145]
}
df = pd.DataFrame(data)

# 피벗테이블 생성
pivot = df.pivot_table(index='성별', columns='흉통유형', values='최대심박수', aggfunc='mean')

# 결과 출력
print("피벗테이블 (결측값 포함):")
pivot


# 결측값을 0으로 대체
pivot_filled = df.pivot_table(index='성별', columns='흉통유형', values='최대심박수', aggfunc='mean', fill_value=0)
# 결과 출력
print("\n결측값을 0으로 대체한 피벗테이블:")
pivot_filled


# 피벗테이블 생성 후 열 기준 평균값으로 대체
pivot_mean_filled = pivot.apply(lambda x: x.fillna(x.mean()), axis=0)
# 결과 출력
print("\n열 기준 평균값으로 대체한 피벗테이블:")
pivot_mean_filled

# 피벗테이블 생성 후 결측값을 999로 대체
pivot_specific_value = pivot.fillna(999)
# 결과 출력
print("\n결측값을 특정 값(999)으로 대체한 피벗테이블:")
pivot_specific_value

 

인텍스와 컬럼 계층 변경

데이터 준비

import pandas as pd

# 데이터 로드
file_path = "datasets/heart.csv"
df = pd.read_csv(file_path)

# 컬럼명 변경
df.columns = ['나이', '성별', '흉통유형', '안정시혈압', '콜레스테롤', '공복혈당', '심전도',
              '최대심박수', '운동유발협심증', 'ST우울증', '운동후ST경사', '주요혈관수',
              '결함유형', '심장질환여부']


그룹화 후 다중 인덱스 생성¶

# 데이터 확인
print("데이터프레임 상위 5개 행:")
print(df.head())

# 다중 인덱스 초기화
grouped_reset = grouped.reset_index()
print("\n다중 인덱스 초기화:")
grouped_reset

다중 컬럼 피벗테이블 생성
pivot = df.pivot_table(index='성별', columns=['흉통유형', '운동후ST경사'], values='최대심박수', aggfunc='mean')
print("\n다중 컬럼 피벗테이블:")
pivot

# 컬럼 계층 초기화
pivot_reset = pivot.reset_index()
pivot_reset.columns = ['_'.join(map(str, col)).strip() for col in pivot_reset.columns]

print("\n컬럼 계층 초기화:")
pivot_reset

# 다중 컬럼을 다중 인덱스로 전환
pivot_stack = pivot.stack()

print("\n다중 컬럼을 다중 인덱스로 전환:")
pivot_stack