하파와 데이터

[빅분기] 실기 1유형- 데이터 변경(수정, 추가, 삭제) 본문

자격증/DATA

[빅분기] 실기 1유형- 데이터 변경(수정, 추가, 삭제)

hhpp 2024. 11. 29. 14:06

지금까지 우리는 수치형 분석, 부분집합 등에 대해서 배웠다. 

 

이제 생각해보자. 그것을 왜 배웠을까? 어디에 써먹으려고??

 

아직은 나도 초심자기 때문에 정확하지는 않지만

데이터를 가지고 이래저래 전처리를 하는 과정은 분석에 있어서, 모델링에 있어서 매우나 중요하다. 

 

일명 Garbege in, Garbege out이라고, 

쓰레기가 들어가면 쓰레기가 나온다. 

그렇기 때문에 우리는 모델을 구축하기 전에, 

좋은 데이터를 넣을 수 있도록 각고의 노력을 기울여야하는 것이다. 

 

그래서 수치형 데이터를 분석하면서, 무언가를 찾아내고

부분집합 등을 활용해서 특정 데이터들을 바꾸거나 수정하거나, 

조합하여 새로운 더미변수를 만들거나 하는 과정을 해야하는 것이다. 

 

이에, 이번에는 데이터를 변경하는 과정을 배워보자!! 

 

0. 전제

이번에는 데이터프레임을 새롭게 하나 만들어보자

이 데이터프레임으로 수정, 추가, 삭제의 과정을 거쳐보자

import pandas as pd
import numpy as np

# index로 사용할 날짜 생성
dates = pd.date_range('20241127', periods = 6)

df = pd.DataFrame(np.random.randn(6,4), index = dates, columns = list('ABCD'))

# 데이터 프레임 확인하기
print(df)

우리가 사용할 데이터프레임!! (난수설정이기에 각각의 값은 매번 다르다)

1. 기존 데이터 조합을 통한 컬럼 추가 

우리는 데이터를 다루다가, 현재 데이터를 기반으로 새로운 컬럼을 만들 필요가 있다. 

예전 내 소방 경진대회에서의 예를 들면, 소방데이터는 건물의 층수를 지상, 지하층수를 따로 구분하는 컬럼을 가지고 있었다. 우리는 각각을 따로 필요로 하지 않았고, 전체 건물의 층수가 필요했다. 이에, 두개를 합쳐서 층수 컬럼을 다시 만들었다. 이처럼 기존 데이터를 조합해서 새로운 컬럼을 만들고자 할때가 있다. 이때도 우리는 매우 쉽게 이를 수행할 수 있다.

# 새로운 E컬럼은 A컬럼과 B 컬럼의 합이다!
df['E'] = df['A'] + df['B']

2. 특정 조건에 부합하는 결과를 수정해보자 

지금의 데이터를 기준으로 봤을때, 'A'컬럼에서 음수는 아무런 의미가 없다면? 

그런 데이터를 모두 0으로 만들어야, 모델링이 잘 이루어진다면? 

 

그럼 'A' 컬럼의 데이터가 음수인 경우를 (<0) 모두 찾아서 변경해야할 것이다. 

어떻게 할 수 있을까? 

우리는 loc를 통해 특정 조건일때의 데이터를 추출하는 방법을 안다. 

그렇다. 특정 조건일때, 특정 데이터 값을 바꿔주세요! 라고 요청하면 된다. 

말이 복잡하지만, 보면 또 쉽다. 

# 우선 새로운 df1을 만들어주자 
df1 = df.copy()

# A 컬럼에서 음수인 경우, 0으로 변경하기 
# 조건을 제시하고, 컬럼에도 A를 지정하여 A의 값을 변경해야한다! 
df1.loc[df1['A']<0, 'A'] = 0

아주 손쉽게 내가 원하는 옵션으로 데이터 값을 치환해버렸다! 

 

3. 데이터 삭제하기

그렇다면, 나에게 필요없는 컬럼이 있다면 어떻게 없앨것인가? 

df.drop을 쓰면 간단히 삭제할 수 있다. 

다만, 실전에서는 소중한 데이터의 유실이 많이 발생하게 될 수 있으니, 유의해서 사용해야한다!! 

# A 컬럼을 삭제하자!
df1 = df1.drop('A', axis=1)
df1

# 또는 inplace = True를 이용하기
# df2를 만들어서 보자! 
df2 = df.copy()
df2.drop('A', axis=1, inplace= True)
df2

drop을 사용할때 유의 할 점은, 이 결과를 할당해야한다는 것이다. 

그래서 위의 방법처럼 df1 = df1.drop()을 이용해서 제거한 결과를 다시 df1에 할당하거나 

또는 옵션에서 inplace = True 조건을 넣어서, 결과를 기존 데이터프레임 값으로 대체할 것이라는 것을 명시해줘야한다. 

 

이 두가지를 하지 않고 그냥 df.drop('A', axis=1)을 하면, 

그냥 없어진 결과가 한번 보이고 끝! 실제로는 데이터프레임에 영향을 주지 않는다! 

 

4. 변수 타입 변경

이건 꽤 많이 사용되는 것 중에 하나다. 

int를 float으로 바꾸거나, int를 str로 바꾸는 등 

데이터를 사용하는 사람들의 필요에 따라서 이래저래 바꿔버릴 수 있고, 그 방법 또한 매우 간단하다! 

 

4.1 데이터 확인

우선 데이터 타입을 변경하기 전에, 어떤 타입인지 확인하는 것부터가 선행되어야할 것이다. 

# 특정 컬럼의 데이터 타입을 확인하는 법! 
df1['B'].dtypes

# 데이터프레임 전체 컬럼의 타입 확인하는법!
df1.info()

4.2 변수 타입 변경

그럼 'B' 타입을 float 에서 int로 변경하자. int로 변경한 뒤, 그걸 다시 str로 변경해보자!! 

df1 = df1.astype({'B':'int64'})
print(df1['B'].dtypes)
df1 = df1.astype({"B":'str'})
print(df1['B'].dtypes)

데이터프레임.astype({'컬럼명':'타입'}) 이렇게 입력하면된다. 당연히 한번에 여러개의 컬럼의 타입도 변경할 수 있다. 

그리고 여기서 중요한건, 딕셔너리 형태로 입력을 해야한다는거다. 특정컬럼은 특정 형태로 변환하는 방식이기 때문에!! 

 

5. Replace(변환) 또는 Map

이번에는 특정 데이터의 값을 다른 것으로 대체하는 방법이다. 

예를들면, 인코딩을 하는것과 동일하다. 

 

우선 iris.csv['variety']의 값들을 수치형으로 라벨링을 해보자! 

Setosa = 0, Versicolor = 1, Virginica = 2 이렇게 말이다. 

import pandas as pd

df = pd.read_csv('data/iris.csv')

df['variety'] = df['variety'].replace({'Setosa': 0, 'Versicolor':1, 'Virginica':2})

df['variety'].unique()

이 과정을 동일하게 map을 이용해서도 할 수 있다. 

import pandas as pd
df = pd.read_csv('data/iris.csv')
print(df.head())
df['variety'] = df['variety'].map({'Setosa':0, 'Versicolor':1, 'Virginica':2})
print('---변경후---')
print(df['variety'].unique())

6. 범주화(척도화) 

지금의 iris처럼 명확하게 기준을 나눌 수 있는 것들은 쉽게 변환시킬 수 있는데, 

만일 나이라면? 그러면 replace를 통해서 10~19세까지를 10대 이렇게 하나씩 코딩을 해야하는것일까? 

답은, 그렇지 않다. 범주화를 하면, 우리가 정하는 기준에 따라서, 잘 나눠주신다!! 

 

# 우선 df 하나 만들기
import pandas as pd
import numpy as np

dates = pd.date_range('20241129', periods=6)

df = pd.DataFrame(np.random.randn(6,4), index = dates, columns = list('ABCD'))
df

# 범주화를 진행할 새로운 컬럼 생성
df['new_a1'] = pd.cut(df['A'],4, labels = False)

df

CUT을 사용하면, pd.cut(범주화할 컬럼, 구간(bins), labels = 구간을 나눈 기준 보이기 여부) 이렇게 할 수 있다. 

다만, 구간을 직접 정하지 않고 지금처럼 구간의 개수만을 제시할 경우, 판다스는 a컬럼의 최소값과 최대값을 기준으로 내가 제시한 4개 구분으로 나눠서 그걸로 분류를 한다. 

 

즉, 10대 20대, 30대, 40대로 구간을 나누고 싶다고 하더라도, 최소 연령이 11세이고, 최대연령이 40이면 아래와 같이 구성된다. 

 

그러면 이를 보완하기 위해선 무엇을 해야할까? 

그것은 바로 내가 구간을 지정해주는 것이다! 

 

df['new_a2'] = pd.cut(df['A'], [-3, -1, 0, 1, 3], labels = [1,2,3,4])

이 코드는 pd.cut(컬럼명, 나눌 기준 값, 각 구분별 카테고리 레이블) 이라고 생각하면 된다. 

반응형