수치형 데이터 전처리
나이 데이터를 구간화하기
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
'파이썬' 카테고리의 다른 글
9. Feature Engieneering (특성공학, 변수파생) (0) | 2025.03.18 |
---|---|
8. 데이터 병합과 추가 (0) | 2025.03.18 |
6. 데이터 전처리 (결측치와 이상치) (0) | 2025.03.17 |
5. 데이터선택하기 (0) | 2025.03.17 |
4. 데이터불러오기 및 저장하기 (0) | 2025.03.17 |