데이터 전처리 딕셔너리]

딕셔너리 생성

{
    '치즈달걀말이': {'가격': 5000},
    '시금치된장국': {'가격': 3000},
    '수수밥': {'가격': 2000},
    '견과류멸치볶음': {'가격': 4000},
    '배추김치': {'가격': 1000}
}

 

데이터 전처리 기본세팅 - 경고 무시

 

경고 무시

import warnings

# 모든 경고 무시
warnings.filterwarnings('ignore')

# 특정 경고 무시
warnings.filterwarnings('ignore', category=RuntimeWarning)

데이터 자료형 리스트

제거 - ( ) 괄호 제거

import re

# 주어진 메뉴 리스트
menu_list = [
    '(우유제외)스크램블에그',
    '고로케',
    '카레고등어구이',
    '콩가루배춧국',
    '크림리조또(간식)',
    '돼지고기파인애플볶음밥',
    '샤인머스켓',
    '고구마스프',
    '돼지고기깻잎볶음',
    '(저염·저당)쇠갈비찜',
    '온청포묵국',
    '양배추샐러드(딸기드레싱)'
]

# 괄호 안의 내용을 제거하는 정규 표현식
regex = re.compile(r'\([^)]*\)')

# 메뉴에서 괄호 안의 내용 제거
cleaned_menu = [regex.sub('', menu).strip() for menu in menu_list]
cleaned_menu

reset_index

# 단지 코드를 index로 전용면적 구간을 컬럼(열)으로 하여 전용면적별세대수 구하기(pivot)
# 결과를 result_5_1 저장
# 단지 코드를 index --> 컬럼으로 변경하기 : reset_index, drop = False, inplace = True

result_5_1 = group_5_1.pivot(index='단지코드', columns ='전용면적구간', values = '전용면적별세대수')
result_5_1.reset_index(inplace = True, drop = False)
display(result_5_1.head())
type(result_5_1)

 

컬럼 -인덱스 변환

## save_check 데이터 프레임의 ['model_name', 'valid_data'] 컬럼을 지정하여 인덱스로 설정해 줍니다.

## 변환한 값은 result_comp 변수에 할당해 주세요.

## 참고함수: set_index

result_comp = save_check.set_index(["model_name","valid_data"])

result_comp

 

# reset_index 원본 데이터

path = 'https://raw.githubusercontent.com/Jangrae/csv/master/pop_simple.csv'
pop = pd.read_csv(path) 
pop.set_index('year', inplace = True)
pop.index.name = None


# 확인
pop.head()

 

 

인덱스 초기화

# pop.reset_index(drop=False)
pop.reset_index(drop=False,inplace=True)


# 확인
pop.head(10)

 

 

# reset_index 활용 drop

# 데이터 읽어오기
import pandas as pd
path = 'https://raw.githubusercontent.com/Jangrae/csv/master/tips.csv'
pop = pd.read_csv(path) 
tip = pd.DataFrame(pop)

tip_top10 = tip.sort_values(by='total_bill',ascending=False)
tip_top10

 

기본 상태

 

drop = Flase 설정

tip_top10 = tip.sort_values(by='total_bill',ascending=False)
tip_top10.reset_index(drop=True, inplace = True)

tip_top10

 

 

drop = True 설정

tip_top10 = tip.sort_values(by='total_bill',ascending=False)
tip_top10.reset_index(drop=True, inplace = True)

tip_top10

data.index.name 활용_데이터 확인 

import numpy as np
import pandas as pd
import os
import csv
import matplotlib.pyplot as plt

data = pd.read_csv('./csv/교원+1인당+학생수(구별)_20230820151017.csv',index_col=0)

data

 

data.index.name = None 적용

import numpy as np
import pandas as pd
import os
import csv
import matplotlib.pyplot as plt

data = pd.read_csv('./csv/교원+1인당+학생수(구별)_20230820151017.csv',index_col=0)
data.index.name = None

data

 

data.index.name = None 적용

import pandas as pd

path = 'https://raw.githubusercontent.com/Jangrae/csv/master/pop_simple.csv'
pop = pd.read_csv(path) 
pop.set_index('year', inplace = True)
pop.index.name = None

# 인덱스 초기화
pop.reset_index(drop=False,inplace=True)


# 확인
pop.head(10)

 

 

데이터 전처리 병합, 합치기]

 

병합, 합치기 - pd.concat() 행 방향으로 붙이기

bicycle_new = pd.concat([f19, f20])
bicycle_new = pd.concat([bicycle_new, f21])

 

병합, 합치기 - pd.concat() 열 방향으로 붙이려면?

bicycle_new = pd.concat([f19, f20], axis =1)

 

병합, 합치기 - pd.merge()

# 데이터프레임 조인
pop = pd.merge(pop01,pop02, on='year', how='outer')
pop = pd.merge(pop,pop03, on='year', how = 'outer')
pop.head()

 

 

데이터 전처리 구간, 범위]

구간 - between

이미 값의 형식이 지정되어 있다.

구간 - pd.cut

bin = [ -np.inf, 숫자, 숫자, 숫자, np.inf ]
label = [ 구간, 구간, 구간, 구간 ]

데이터프레임['새로 만들 컬럼명'] = pd.cut( 데이터프레임['기존 컬럼명'],
					bins = bins, labels = labels)

 

 

구간 - pd.cut, describe

q1 = titanic['Age'].describe()['25%']
q2 = titanic['Age'].describe()['50%']
q3 = titanic['Age'].describe()['75%']
print(q1, q2, q3)

bin = [-np.inf,q1,q2,q3,np.inf]
label = list('abcd')
titanic['AgeGrp'] = pd.cut(titanic['Age'], bins = bin,labels = label)
titanic

 

 

데이터 전처리 정렬]

정렬 - 전치 이후에 정렬

print('='*100)
print('원본 데이터')
print('='*100)
Cost_Guard_reason_2017 = Cost_Guard_reason.iloc[[2],:].drop('연도', axis = 1)
display(Cost_Guard_reason_2017)

print('='*100)
print('transpose를 진행한다.')
print('='*100)
Cost_Guard_reason_2017_trans = Cost_Guard_reason_2017.transpose()
display(Cost_Guard_reason_2017_trans)

print('='*100)
print('오름차순 정렬을 진행한다.')
print('='*100)
Cost_Guard_reason_2017_trans_sorted = Cost_Guard_reason_2017_trans.sort_values(by=2, ascending = True)
display(Cost_Guard_reason_2017_trans_sorted)

 

정렬 - 오름차순 정렬

merge_participate_submission['참가자 수'].sort_values()

 

정렬 - 내림차순 정렬

merge_participate_submission['참가자 수'].sort_values(ascending = False)

 

정렬 - 선택한 열들 중 특정 열을 기준으로 정렬

tip.loc[:, ['tip' ,'day', 'time']].sort_values(by='tip', ascending = False)

 

 

정렬 - 딕셔너리 sorted, items, lambda, reverse

# 딕셔너리를 값에 따라 내림차순으로 정렬
sorted_wordCount = dict(sorted(wordCount.items(), key=lambda item: item[1], reverse=True))

# 결과 출력
print(sorted_wordCount)

 

정렬 - 리스트 정렬

lst.sort()

 

 

정렬 - 리스트_두 번째 요소로 정렬 방법 1

lst = [[1, 3], [2, 4], [3, 5]]

# lst를 내부 리스트의 두 번째 요소를 기준으로 오름차순 정렬
sorted_lst = sorted(lst, key=lambda x: x[1])

print(sorted_lst)

 

정렬 - 리스트_두 번째 요소로 정렬 방법 2

lst = [[1, 3], [2, 4], [3, 5]]

# lst를 내부 리스트의 두 번째 요소를 기준으로 오름차순 정렬 (원본 리스트를 변경)
lst.sort(key=lambda x: x[1])

print(lst)
 

데이터 전처리 조회, 찾기, 탐색, 확인, 정보]

조회 - 조건 -  컬럼 조건 조회

데이터프레임.loc[ 데이터프레임['컬럼명'] >= 30 ]

 

조회 - 조건 - 조건 여러 개 세팅

tip.loc[ ( tip['tip'] > 6.0) & (tip['day'] == 'Sat'), :]

 

조회 - 조건 - 문장에서 구분점을 기준으로 데이터를 분리하여 추출 split()

# 키워드를 추출하고 가장 많이 등장한 상위 10개를 세어줍니다.
keywords = competition_info_df['키워드'].str.split('|').explode()
keyword_counts = keywords.value_counts().head(10)
print(keyowrd_counts)

 

 

조회 - 특정 - 문자와 숫자가 함께 있을 때 숫자 부분만 조회

import pandas as pd

# 예시 데이터 생성
data = {'용량': ['100ml', '250ml', '500ml', '1L', '2.5L']}
df = pd.DataFrame(data)

# '용량' 열에서 숫자 부분만 추출
df['숫자'] = df['용량'].str.extract('(\d+\.?\d*)')

df

 

조회 - 특정 - 컬럼에서 원하는 부분만 슬라이싱

nation_wide['식품중량'].str[0]

 

 

조회 - 특정 - 원하는 부분만 추출, "칼럼이름".str[n:n]

import pandas as pd

df = pd.read_csv('train.csv')
df.ID.str[0:6] # 여기에서 ID는 데이터프레임의 컬럼 이름

 

 

조회 - 특정 - timedelta에서 원하는 요소만 조회

display(df_competition['진행기간'][0])
df_competition['진행기간'][0].days

 

조회 - 특정 - isin() 특정 정보 포함

 

조회 - 특정 - 특정 키워드 포함 str.contains

df_competition.loc[df_competition['키워드'].str.contains("알고리즘"),:]

 

 

조회 - 특정 -특정 키워드를 제외한 데이터 탐색 ~df['컬럼명'].str.contains('글자')

seoul_monthly_2023_school = seoul_monthly_2023.loc[seoul_monthly_2023['대여소명'].str.contains('학교') &
                                                  ~seoul_monthly_2023['대여소명'].str.contains('역') &
                                                  ~seoul_monthly_2023['대여소명'].str.contains('정류장')]
seoul_monthly_2023_school

 

조회 - 특정 - 컬럼에서 "특정 데이터"를 포함하는 행만 출력

# 예시
# 단일 조건 
df.loc[ df['cmpSclNm'] =='중소기업']

# 조건 여러 개
df.loc[ ( df['기업명'] == '(주)드림' ) & ( df['accNm'] == '영업이익' ) ]

 

 

조회 - 특정 - 특정 열 조회

tip.loc[:,'total_bill']

 

 

조회 - 특정 - 여러 컬럼 선택 조회

tip.loc[:, ['tip', 'total_bill'] ]

 

 

조회 - 특정 - 특정 열 조회 loc 방식 비교

 

조회 - 일치 - 컬럼명 일치 여부 확인 

target_01 = bicycle_20_01
target_06 = bicycle_20_06
feature = [ bicycle_20_01,bicycle_20_02,bicycle_20_03,bicycle_20_04,bicycle_20_05,bicycle_20_06,
bicycle_20_07,bicycle_20_08,bicycle_20_09,bicycle_20_10,bicycle_20_11,bicycle_20_12]

for i in feature:
    print(target_01.columns == i.columns)

 

for i in feature:
    print(target_06.columns == i.columns)

 

조회 - 컬럼의 데이터별 갯수 구하기 value_counts

df['컬럼 이름'].value_counts()

 

조회 - 형식 - 숫자가 아닌 행 찾기 데이터프레임

[ 데이터프레임['컬럼명'].str.isnumeric() == False ]

 

조회 - 형식 - 수치형인 컬럼만 추출

numeric_columns = df[ df.dtypes != 'object'  ]

 

조회 - 형식 - 문자형인 컬럼만 추출

string_columns = df[ df.dtypes == 'object' ]

조회 - 형식 - 숫자형 데이터, 문자형 데이터 구분

# 데이터 유형을 문자열과 숫자로 구분
is_string = df_competition['상금 정보'].apply(lambda x: isinstance(x, str))
is_numeric = df_competition['상금 정보'].apply(lambda x: isinstance(x, (int, float)))

display(is_string)
print()

# 문자열과 숫자 데이터의 개수 세기
num_strings = is_string.sum()
num_numerics = is_numeric.sum()

print("문자열 데이터 개수:", num_strings)
print("숫자형 데이터 개수:", num_numerics)

 

정보 확인 - info

# 데이터 기초 정보 확인2
## data 데이터프레임의 컬럼명, 데이터 개수, 타입 정보를 보기 쉽게 출력해 주세요.
## .info 파라미터: verbose=True, null_counts=True

data.info(verbose=True, null_counts=True)

 

verbose=True: 이 옵션을 사용하면 데이터프레임의 모든 컬럼에 대한 상세한 정보를 출력합니다. 컬럼명, 컬럼의 데이터 타입, 비어 있지 않은 값의 개수(null이 아닌 값의 개수), 메모리 사용량 등이 포함됩니다.

 

verbose=False: 이 옵션을 사용하면 데이터프레임의 요약 정보만 출력됩니다. 모든 컬럼의 상세한 정보는 출력되지 않으며, 데이터프레임의 크기(행과 열의 개수)와 같은 기본 정보만 표시됩니다.

 

 

정보 확인 - 컬럼의 데이터별 갯수 구하기 value_counts

df['컬럼 이름'].value_counts()

 

정보 확인 - 데이터 비중 확인

data['Activity'].value_counts() / data['Activity'].value_counts().sum()

 

 

정보 확인 - describe 함수

 

 

 

정보 확인 - shape

# 데이터 읽어오기
import pandas as pd
import csv
path = 'https://raw.githubusercontent.com/Jangrae/csv/master/tips.csv'
tip = pd.read_csv(path)

# 확인
tip

# total_bill 열 조회
tip.shape

 

정보 확인 - info 함수

 

정보 확인 - index

 

정보 확인 - sort_values()

 

 

 

데이터 전처리 정보, 형태 변경, 변형]

변경 - 데이터 - replace

titanic['Sex'] = titanic['Sex'].replace({'male':1, 'female':0})

 

 

변경 - 데이터 - 컬럼 안 데이터 다른 값으로 바꾸기 map

y_train_map = y_train.map({'STANDING':0, 'SITTING':1, 'LAYING':2, 'WALKING':3, 'WALKING_UPSTAIRS':4, 'WALKING_DOWNSTAIRS':5})

y_val_map = y_val.map({'STANDING':0, 'SITTING':1, 'LAYING':2, 'WALKING':3, 'WALKING_UPSTAIRS':4, 'WALKING_DOWNSTAIRS':5})

y_val_map

변경 - 데이터 - 특정 컬럼 안의 데이터 프레임에서 띄어쓰기 기준, 앞 데이터 선택

# 데이터프레임의 특정 컬럼에서 띄어쓰기를 기준으로 앞 부분만 선택하여 기존 데이터 대체

# 예시 데이터프레임 생성
df = pd.DataFrame({
    'Menu': [
        '스크램블에그',
        '고로케',
        '카레 고등어구이',
        '콩가루 배춧국',
        '크림 리조또',
        '돼지고기 파인애플볶음밥',
        '샤인머스켓',
        '고구마 스프',
        '돼지고기 깻잎볶음',
        '쇠갈비 찜',
        '온청포 묵국',
        '양배추 샐러드'
    ]
})

# 띄어쓰기를 기준으로 첫 부분만 선택하여 기존 데이터 대체
df['Menu'] = df['Menu'].apply(lambda x: x.split(' ')[0])
df

 

 

변경 - 데이터 - 이름에서 괄호 (  ) 부분을 제거하고 기존 값을 대체

# 괄호가 포함된 새로운 예시 데이터프레임 생성
df_with_parentheses = pd.DataFrame({
    'Menu': [
        '스크램블에그(달걀)',
        '고로케(감자)',
        '카레(고등어)',
        '콩가루(배춧국)',
        '크림(리조또)',
        '돼지고기(파인애플볶음밥)',
        '샤인머스켓(포도)',
        '고구마(스프)',
        '돼지고기(깻잎볶음)',
        '쇠갈비(찜)',
        '온청포(묵국)',
        '양배추(샐러드)'
    ]
})

# 괄호와 괄호 안의 내용을 제거하는 정규 표현식
regex = re.compile(r'\([^)]*\)')

# 메뉴에서 괄호 안의 내용 제거 후 띄어쓰기를 기준으로 첫 부분만 선택
df_with_parentheses['Menu'] = df_with_parentheses['Menu'].apply(lambda x: regex.sub('', x).split(' ')[0])
df_with_parentheses

 

변경 - 순서 - 컬럼 순서 변경

# 열 순서 변경
pop_test = pop_test[['year', 'household', 'total', 'male', 'female', 'k_total', 'k_male', 'k_female', 'f_total', 'f_male', 'f_female', 'older_65']]

 

 

 

변경 - 컬럼 - 컬럼명을 첫 행의 값으로 변경, 첫 행 삭제

import pandas as pd

# 데이터프레임 예시 생성
data = [["Column1", "Column2", "Column3"], [1, 2, 3], [4, 5, 6]]
df = pd.DataFrame(data)
display(df)

# 첫 번째 행을 컬럼으로 설정
df.columns = df.iloc[0]
display(df)

# 첫 번째 행 삭제
df = df.drop(df.index[0])
display(df)

변경 - 컬럼 - 데이터 프레임 인덱스 지정

df = pd.DataFrame(data, index=['Row1', 'Row2', 'Row3', 'Row4'])

 

변경 - 데이터 선택 - 특정 데이터를 포함한 행만 남기기 isin()

com_values  =  ['유동비율', '차입금', '자기자본', '총자산']

filtered_data = data_small[data_small['com'].isin(com_values)]

변경 - 이름 - 이름 변경 rename

# 데이터 읽어오기
path = 'https://raw.githubusercontent.com/Jangrae/csv/master/pop_simple.csv'
pop = pd.read_csv(path) 
pop.set_index('year', inplace = True)
pop.index.name = None


pop.reset_index(drop=False,inplace=True)

# 열 이름 변경
pop.rename(columns={'index':'year'}, inplace=True)

# 확인
pop.head(10)

 

 

변경 - 이름 - 컬럼 이름 변경 rename

데이터프레임.rename( columns = { '변경 전 컬럼이름' : '변경 후 컬럼이름',
                     '변경 전 컬럼이름' : '변경 후 컬럼이름'} )

 

변경 - 이름 - 변경

pop.rename(columns={'index':'year'}, inplace=True)

# 확인
pop.head()

변경 - 이름 - 컬럼명 변경, 반복문

for i in feature:
    i.rename(columns = {'이동거리(M)' :'이동거리',
                        '이용시간(분)':'이용시간'}, inplace =True)
for i in feature:
    print(target_01.columns == i.columns)

 

 

변경 - 행 - 특정 컬럼에서 리스트 안에 있는 데이터와 일치하는 행만 남기기

import pandas as pd

# 예시 데이터프레임 생성
df = pd.DataFrame({
    '음식명': ['잡곡밥', '땅콩연근조림', '생선까스', '김치찌개', '된장국'],
    '가격': [5000, 6000, 7000, 8000, 9000]
})

# 특정 음식명만 포함하는 행을 필터링
filter_list = ['잡곡밥', '땅콩연근조림', '생선까스']
filtered_df = df[df['음식명'].isin(filter_list)]

filtered_df

변경 - 형식 - 변경 astype()

## 해당 칼럼의 dtype을 object --> float로 수정하기 : astype

danji_detail['임대보증금'] = danji_detail['임대보증금'].astype(float)
danji_detail['임대료'] = danji_detail['임대료'].astype(float)

## 확인하기 : info
danji_detail.info()

 

변경 - 형식 -  to_datetime, to_period, astype(str) 모두 사용

from datetime import datetime

df_participate['일자'] = pd.to_datetime(df_participate['일자'])
df_participate['월별'] = df_participate['일자'].dt.to_period('M')
df_participate['월별'] = df_participate['월별'].astype(str)
df_participate.drop(['ID','일자'], axis = 1, inplace = True)

 

추가 - 컬럼 - 새로운 컬럼(column)을 추가

import pandas as pd

# 예시 데이터프레임 생성
df = pd.DataFrame({
    '열1': [1, 2, 3],
    '열2': [4, 5, 6]
})

# 새로운 열 추가 및 모든 행에 동일한 텍스트 데이터 할당
df['새로운열'] = '텍스트 데이터'

print(df)

 

추가 - 컬럼 - 새로운 컬럼 추가

import pandas as pd

# 예시 데이터프레임 생성 (3행)
df = pd.DataFrame({
    '열1': [1, 2, 3],
    '열2': [4, 5, 6]
})

# 리스트를 새 열로 추가
df['새로운열'] = ['밥', '김치', '된장']

print(df)

추가 - 컬럼 - 컬럼 추가, 리스트 형태

# 리스트를 포함하는 새 열 추가
df_competition['새로운열'] = [[1, 2], [3, 4]]

 

추가 - 컬럼 - 컬럼 추가, 컬럼 뺄셈

df_competition['진행기간'] = pd.to_datetime(df_competition['종료시간']) - pd.to_datetime(df_competition['시작시간'])
df_competition.head(3)

 

추가 - 컬럼 - 컬럼 추가, 특정 값으로 채우기

bicycle_merge = df[['stationName','stationLatitude','stationLongitude']].copy()
bicycle_merge['분류명'] = '자전거 대여소'
bicycle_merge

 

 

데이터 전처리 삭제, 제거]

삭제 - 데이터 삭제 drop

titanic.drop(['SibSp','Parch'], axis=1, inplace= True)

 

 

삭제 - 컬럼 삭제

# 특정 열 삭제

데이터프레임.drop('열 이름', axis=1, inplace = True)

# 여러 열 삭제

삭제할 열 리스트 = [ '열 이름 1', '열 이름 2' ]

데이터프레임.drop( columns = 삭제할 열 리스트, axis =1, inplace = True )

 

삭제 - 데이터프레임의 중복 컬럼 삭제

# 'A' 컬럼 중 첫 번째만 선택
new_df = df.loc[:, ~df.columns.duplicated()]

삭제 -  행 - 삭제

# 특정 행 삭제
데이터프레임.drop( '행 이름', inplace = True )

# 여러 행 삭제
삭제할 행 리스트 [ '행 이름 1', '행 이름 2' ]

데이터프레임.drop( 삭제할 행 리스트, inplace = True )

# 조건 삭제
# 예시 : 30 이상인 행 삭제

데이터프레임 = 데이터프레임[ 데이터프레임['Age'] < 30]

 

삭제 - 행 - 컬럼명을 첫 행의 값으로 변경, 첫 행 삭제

import pandas as pd

# 데이터프레임 예시 생성
data = [["Column1", "Column2", "Column3"], [1, 2, 3], [4, 5, 6]]
df = pd.DataFrame(data)
display(df)

# 첫 번째 행을 컬럼으로 설정
df.columns = df.iloc[0]
display(df)

# 첫 번째 행 삭제
df = df.drop(df.index[0])
display(df)

삭제 -  행 - 첫 번째 행을 삭제

df.drop(df.index[0)

 

삭제 - 행 - 중복행 제거하기

df.drop_duplicates( subset=None, keep = 'first', inplace = True, ignore_index = False)

# subset : 중복 검사를 할 때 고려해야 할 열을 지정하는 매개변수

# keep = 'first' : 중복된 행 중 어떤 행을 유지할지 지정하는 매개변수

 

data_check[(data_check['기업명']=='(주)드림오브***')
	& (data_check['accNm']=='영업이익') ].drop_duplicates(subset = ['기업명'],keep='first'))

 

삭제 - 행 - 중복행 제거하기

데이터프레임.drop_duplicates( subset = None, keep='first',
                           inplace = True, ignore_index = False )

#  subset : 중복을 검사할 때 고려해야 할 열을 지정하는 매개변수
# keep = 'first' : 중복된 행 중 어떤 행을 유지할지 지정하는 매개변수

# ignore_index = Fasle : 이 매개변수가 'False'로 설정되면 인덱스(행 번호)를 재설정하지 않는다.

# 예시
df.drop_duplicates( subset  = ['B'], keep = 'first' , inplace = True)

 

 

삭제 - 행 - Null값( = 결측치 )이 포함된 행을 제거

df = df.dropna()

 

삭제 - 행 - 값이 0인 행을 제거

df = df.loc[(df !=0).all(axis=1)]

 

삭제 - 결측치 제거

# 하나라도 결측치 포함
df.dropna()

# 모든 데이터가 결측치
df.dropna(how = 'all' )

 

 

데이터 전처리 결측치] 

대체 - 결측치 대체 0으로 채우기

데이터프레임.fillna(0)

 

조회, 확인 - 결측치 확인 isnull()

# 결측치 확인
pop.isnull().sum()

 

조회, 확인 - 결측치가 존재하는 행 찾기

df.loc[df.isna() == True]
bicycle_20.loc[bicycle_20['성별'].isna() == True]
 

 

제거 - 결측치 제거 dropna()

# 결측치 제거
pop_test = pop.copy()

pop_test.dropna(subset = ['f_male'],axis=0, inplace = True)

 

제거 - Null값( = 결측치 )이 포함된 행을 제거

df = df.dropna()

 

제거 - 결측치 제외

# 하나라도 결측치 포함
df.dropna()

# 모든 데이터가 결측치
df.dropna(how = 'all' )

데이터 전처리 날짜, date, Date]

변경 - timedelta 형식의 시리즈열 데이터 유형을 days로 변경

display(df_competition['진행기간'][0])
display(df_competition['진행기간'][0].days)

df_competition['진행기간'] = df_competition['진행기간'].apply(lambda x: x.days)
df_competition['진행기간']

 

 

lambda 함수를 사용하면 pandas 시리즈의 각 요소에 대해 주어진 함수를 적용

 

변경 - pd.to_datetime

import datetime

# '날짜' 열을 datetime 형식으로 변환
df_participate['일자'] = pd.to_datetime(df_participate['일자'])

# 월별 열 생성
df_participate['월별'] = df_participate['일자'].dt.to_period('M')

df_participate.head()

 

 

조회 - 오늘 날짜 출력

from datetime import datetime
print(datetime.today())
print(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.today().strftime("%Y-%m-%d"))

 

조회 -  오늘 날짜의 일 단위만 조회

from datetime import datetime

# 오늘 날짜만 조회
today_date = today_date.day
today_date

조회 - timedelta, 2년 전 날짜 조회

from datetime import datetime
from datetime import timedelta
print(datetime.today())
print(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.today().strftime("%Y-%m-%d"))

two_years_ago = datetime.today() - timedelta(days = 2*365)
print(two_years_ago.strftime("%Y-%m-%d"))

 

조회 - timedelta에서 원하는 요소만 추출

display(df_competition['진행기간'][0])
df_competition['진행기간'][0].days

 

 

변경 - 여러 행에 메서드를 적용 lambda, days

display(df_competition['진행기간'][0])
display(df_competition['진행기간'][0].days)

df_competition['진행기간'] = df_competition['진행기간'].apply(lambda x: x.days)
df_competition['진행기간']

 

데이터 전처리 파일 관리]

변경

import pandas as pd

# UTF-8 인코딩으로 파일 읽기
df = pd.read_csv('mymeal_all.csv', encoding='utf-8')

# CP949 인코딩으로 파일 저장
df.to_csv('mymeal_all_cp949.csv', encoding='cp949', index=False)

 

저장 - csv로 저장

# 결과 저장
# result 변수를 인덱스 미포함하여 'result3.csv' 파일로 저장 합니다.
# 저장경로는 현재 경로의 하위 './data' 폴더로 지정해 주세요.

result.to_csv('./data/result3.csv',index=False)

 

 

저장 - 특정 위치에 csv로 저장

import pandas as pd

# 예시 DataFrame 생성
data = {'Column1': [1, 2, 3], 'Column2': [4, 5, 6]}
your_dataframe = pd.DataFrame(data)

# CSV 파일로 저장할 경로
file_path = 'path/to/your/folder/filename.csv'

# DataFrame을 CSV 파일로 저장
your_dataframe.to_csv(file_path, index=False)

 

저장 - Excel로 저장

df.to_excel('example.xlsx', index=False)

 

조회, 확인 - 특정 위치의 파일 목록 확인

import os

# 확인하고 싶은 디렉토리 경로
directory_path = 'your/directory/path'

# 디렉토리 내의 파일과 하위 디렉토리 목록 가져오기
file_list = os.listdir(directory_path)

# 파일 목록 출력
print(file_list)

 

데이터 전처리 딕셔너리]

추가, 삽입 - 딕셔너리에 데이터 삽입

딕셔너리에 새로운 키-값 쌍을 추가하는 방법은 다음과 같습니다.

menu_dict[nutrient.capitalize()] = amount


만약 여러 키-값 쌍을 한 번에 추가하려면, update 메소드를 사용할 수 있습니다.

menu_dict.update({new_key1: new_value1, new_key2: new_value2})

데이터 전처리] 1,234 등 숫자에서 쉼표를 제거하고 숫자형으로 형식 변경, 빈 칸 np.nan으로 대체 및 제거, str.replace(',', '').astype(float), np.nan, subset

 

seoul_monthly_2023['대여건수'] = seoul_monthly_2023['대여건수'].str.replace(',', '').astype(float)
seoul_monthly_2023['반납건수'] = seoul_monthly_2023['반납건수'].str.replace(',', '')
seoul_monthly_2023['반납건수'] = seoul_monthly_2023['반납건수'].str.replace(' - ', '')
seoul_monthly_2023['반납건수'].replace('', np.nan, inplace = True)
seoul_monthly_2023.dropna(subset=['반납건수'], inplace= True)
seoul_monthly_2023['반납건수'] = seoul_monthly_2023['반납건수'].astype(float)

시각화 matplotlib] "barh 내림차순 정렬" plt.barh, transpose, sort_values

 

print('='*100)
print('원본 데이터')
print('='*100)
Cost_Guard_reason_2017 = Cost_Guard_reason.iloc[[2],:].drop('연도', axis = 1)
display(Cost_Guard_reason_2017)

print('='*100)
print('transpose를 진행한다.')
print('='*100)
Cost_Guard_reason_2017_trans = Cost_Guard_reason_2017.transpose()
display(Cost_Guard_reason_2017_trans)

print('='*100)
print('오름차순 정렬을 진행한다.')
print('='*100)
Cost_Guard_reason_2017_trans_sorted = Cost_Guard_reason_2017_trans.sort_values(by=2, ascending = True)
display(Cost_Guard_reason_2017_trans_sorted)

 

 

plt.barh(y = Cost_Guard_reason_2017_trans_sorted.index, width = Cost_Guard_reason_2017_trans_sorted[2].values)

데이터 전처리 가변수화] one-hot encoding, pd.get_dummies

one-hot encoding

 

- 원-핫 인코딩(One-Hot Encoding):

각 범주를 독립된 열로 나타내며, 해당 범주에 속하는 경우 1, 그렇지 않은 경우 0으로 표시

예를 들어, '색상'이라는 특성이 '빨강', '파랑', '초록' 세 가지 범주를 가질 때, 원-핫 인코딩은 이를 세 개의 열로 변환합니다 ('빨강', '파랑', '초록'). 각 열은 해당 색상이면 1, 아니면 0으로 표시됩니다.

 

- 가변수화(Dummy Variable Encoding):

원-핫 인코딩과 유사하지만, 범주 중 하나를 기준(기준 범주)으로 삼아 그 범주를 제외한 나머지 범주에 대해서만 열을 생성

이 방법은 다중공선성(multicollinearity) 문제를 방지하기 위해 사용되며, 통계 모델링에서 자주 사용

예를 들어, 위와 같은 '색상' 특성에 대해 가변수화를 적용할 때, '빨강'을 기준으로 삼으면 '파랑'과 '초록'에 대해서만 열이 생성

 

 

 

pd.get_dummies 함수를 사용하여 drop_first=True 옵션을 설정한 경우, 이는 원-핫 인코딩을 수행하되 첫 번째 범주를 제외한 가변수화(dummy variable encoding)에 해당

 

cat_cols = ['ShelveLoc', 'Education', 'US', 'Urban']
x = pd.get_dummies(x, columns = cat_cols, drop_first = True)

범주형 feature -> 수치형 target

 

카이제곱 검정, ttest, ANOVA 검정에서의 p_value의 의미 

 

  t-검정

 

- 귀무가설 : 집단의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

  카이제곱 검정

 

- 귀무가설 : 두 집단의 빈도 분포가 독립적이다.

- p-value < 0.05 : 귀무 가설 기각, 두 집단의 빈도 분포가 독립적이지 않을 것이다.

 

  ANOVA 

 

- 귀무가설 : 집단(세 개 이상)의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

 

(1) Gender

plt.figure(figsize = (15,8))
sns.barplot(x='Gender', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['Gender'].value_counts()

 

 

## 평균 분석 : ttest_ind

t_male = base_data.loc[base_data['Gender']=='M', 'Score_diff_total']
t_female = base_data.loc[base_data['Gender']=='F', 'Score_diff_total']

spst.ttest_ind(t_male, t_female)

 

 

3-2-2) 학습목표

 

# 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습목표', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습목표'].value_counts()

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습목표']=='승진', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습목표']=='자기계발', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습목표']=='취업', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

3-2-3) 학습방법

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습방법', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습방법'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습방법']=='온라인강의', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습방법']=='오프라인강의', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습방법']=='참고서', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

  3-2-4) 강의 학습 교재 유형

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='강의 학습 교재 유형', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

 

## 범주 데이터 확인 : value_counts()
base_data['강의 학습 교재 유형'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['강의 학습 교재 유형']=='일반적인 영어 텍스트 기반 교재', 'Score_diff_total']
anova_2 = base_data.loc[base_data['강의 학습 교재 유형']=='영상 교재', 'Score_diff_total']
anova_3 = base_data.loc[base_data['강의 학습 교재 유형']=='뉴스/이슈 기반 교재', 'Score_diff_total']
anova_4 = base_data.loc[base_data['강의 학습 교재 유형']=='비즈니스 시뮬레이션(Role Play)', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3, anova_4)

 

 

 3-2-6) 취약분야 인지 여부

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='취약분야 인지 여부', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()

base_data['취약분야 인지 여부'].value_counts()

 

## 평균 분석 : ttest_ind

t_yes = base_data.loc[base_data['취약분야 인지 여부']=='알고 있음', 'Score_diff_total']
t_no = base_data.loc[base_data['취약분야 인지 여부']=='알고 있지 않음', 'Score_diff_total']

spst.ttest_ind(t_yes, t_no)

 

 

피어슨 상관계수, regplot

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import scipy.stats as spst   

target = '등록차량수'

for feature in analyze_features:

    print(f"[{feature}] 통계 분석 및 그래프 분석")

    # 통계 분석 : 통계 분석

    print("   ***** 통계 분석 *****")
    result = spst.pearsonr(data[feature], data[target])
    print(feature, " vs ", target, " 상관 분석: ", spst.pearsonr(data[feature], data[target]))
    
    if result[1] > 0.05:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 주지 않는다")
    else:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 준다")

    # 그래프 분석 : regplot

    # plt.figure(figsize = (12,8))
    print("   ***** 그래프 분석 *****")
    sns.regplot(x = feature, y= target, data = data)
    plt.grid()
    plt.show()
    
    print("")
    print("-"*50)

 

 

heatmap

 

## 각 컬럼간 상관계수에 대한 heatmap 그래프 분석

plt.figure(figsize = (20,12))
sns.heatmap(data[col_num].corr(),cmap="PiYG", annot=True)
plt.show()

 

시각화 matplotlib] plt.bar, plt.barh

 

plt.bar

 

import matplotlib.pyplot as plt
%config InlineBackend.figure_format='retina'

plt.figure(figsize=(6,4))
plt.bar(x=tmp['AgeGrp'], height=tmp['Survived'])
plt.xlabel('AgeGrp')
plt.ylabel('Survived')
plt.ylim(0,1)
plt.show()

 

 

plt.bar, plt.xticks(rotation = 숫자)

 

plt.figure(figsize = [20,15])
plt.bar(x = df_participate['월별'], height = df_participate['참가자 수'])
plt.xticks(rotation =45 )
plt.show()

 

plt.barh

 

gongong

 

 

import pandas as pd
import matplotlib.pyplot as plt
gongong = pd.read_csv('한국건강가정진흥원_다문화가족 이중언어코치 지역별 현황_20220831.csv', encoding = 'CP949')

# 한글 폰트를 설정하자
plt.rc('font', family='Malgun Gothic') # For Windows
plt.rc('axes', unicode_minus=False)
plt.rcParams['font.family']

# 인덱스가 한글이기 때문에 가로 막대로 출력하는 것이 더 가시적이다.
plt.barh(y=gongong['지역'].astype(str), width = gongong['합계 : 이중언어코치 인원(명)'], color = ['C4'], alpha = 0.7, 
         label = ' 인원(명)')
plt.xticks(list(range(0,21,2)))
plt.title('이중언어코치의 수')


plt.legend()
plt.show()

 

 

+ Recent posts