에이블스쿨 DX커리큘럼 - DataFrame 수정
데이터 분석의 80% 이상은 데이터 전처리 및 수정작업이라고 할 수 있다. 정량적인 데이터가 거의 없고, 결측치의 경우, 데이터 분석에 치명적일 수 있기 때문이다.
DataFrame을 확인하는 방법만 기재했는데, 수정하는 방법도 기재하고자 한다.
● 데이터프레임 변경
- 컬럼 변경
df.rename(columns = {‘바꾸기 전 컬럼’ : ‘바꾼 후 컬럼’}, inplace = True)
df.columns = [‘모든’,’컬럼’,’이름들’ ] #변경 필 없으면 기존 컬럼명을 부여한다.
df.insert( 컬럼위치, ‘컬럼명’, 추가하고 싶은 데이터)
- 인덱스 변경
df. set_index(‘컬럼명’, inplace = True) # 컬럼을 인덱스화
df. index.name = ‘ ‘ # 인덱스명 변경(None 입력시, 값 제거)
df. rest_index(drop = True or False, inplace = True) #인덱스화 했던 컬럼을 다시 컬럼화
- 값 삭제 및 변경
df.drop
([‘삭제할 컬럼’], axis = 1, inplace = True) #axis = 1 이면 열별 삭제, axis = 0 이면 행별 삭제
### drop 함수는 index.no로만 지정해서 삭제가 가능. 만약 df 안의 특정 내용들을 삭제하고 싶다면, index.no화 시켜야 함
df.drop(df[df[‘특정 컬럼’] == 조건].index, axis = 0, inplace = True) == .index가 있음에 주의!!!!
drop에서 특정 컬럼의 특정 조건을 제거하고 싶은 경우, drop을 바로 사용하면 안되고, 리스트를 통해서 제거해야 한다.
예를 들어, ‘컬럼명’ == ‘찾고자 하는 조건’ 을 찾아서 삭제하고 싶은 경우,
lst = list(df.loc[df['컬럼명'] == '찾고자 하는 조건', :].index) 를 통해 인덱스화 시켜서
drop.(lst , axis = 0 or 1, )
df[‘컬럼명’] = df[‘컬럼명’] . map({‘A’ : 1, ‘B’: 2 }) #범주형 값을 다른 값으로 변경 가능 , #매핑 안되면 모두 결측치되니 주의!
df[‘컬럼명’] = df[‘컬럼명’] . replace({‘A’ : 1, ‘B’ : 2}) #replace의 경우, 모든 열에 대해서 변경할 수 있으니, 유의.
#매핑 안되면 기존 값 유지 = replace를 우선적으로 쓰자
-범주 값 만들기(이산화 : Discretization)
df.[‘컬럼명’] = pd.qcut(df[‘컬럼명’], 나누고 싶은 구간 개수, labels = [리스트 형태 구간 이름])
è 개수로 나누기 때문에 두 번째 파라미터가 간단한 편.
df[‘컬럼명’] = pd.cut(df[‘컬럼명’], bins = [나누고 싶은구간 리스트화], labels = [리스트형태 구간이름])
è 보통 bin과 label을 리스트화 하여 변수 입력해주고 사용한다.
ex) bin = [-np.inf, 2,5,10,n
p.inf] =구간 기준이 n개면 구간은 n-1개
label = [‘a’,’b’,’c’,’d] = label역시 n-1개가 된다. 이렇게 처리 한 뒤 bins와 labels에 대입해버린다.
● 기존 열 중 하나를 인덱스로 설정하기
1. 데이터프레임(이하 df)의 column중 중복이 없으면 index로 사용하기 좋다. 하나 골라서
df.set_index(‘인덱스로 바꾸고 싶은 column명’) 하거나
df.set_index(‘인덱스로 바꾸고 싶은 column명’, inplace = True) 진행. ==inplace = 바로 적용시킬건지
**해당 작업 이후, 변환 없이 해당 작업을 다시 진행시키면 column에서 index가 넘어왔기 때문에 에러난다. 한번 변환시키면 column에는 해당 index열이 없다는 것을 기억하자.**
2. index가 된 column이 column시절 이름을 가지고 있으므로, index이름 삭제
df.index.name = None
위의 작업으로 진행된 index가 마음에 들지 않으면 바꿔야 한다. 이때, index값들을 버릴건지 아닐건지 결정
* df.reset_index(drop = True or False)는 인덱스를 초기화 시키는데, True면 index값을 버리고, False면 column으로되돌린다.
* drop = False로 되돌아간 index는 index라는 column명을 가지기 때문에
df.rename(columns = {‘index’:’바꿔줄 column명’}, inplace = True)를 통해 변경을 진행한다.
다.
● 결측치 관련
1. 결측치 조회
isna()도 가능.
df.isnull().sum() == 결측치 개수를 조회 #열의 결측치 확인하는 경우, sum() 안에 axis = 0
df.notnull().sum == 결측치가 아닌 개수를 조회
2. 결측치 삭제
df.dropna(axis = 0, inplace = True) == 결측치가 하나라도 있는 행 제거
df.dropna(subset = [‘특정 컬럼’], axis = 0, inplace = True) == 특정 컬럼의 행에 결측치가 있으면 해당 행을 제거
df.dropna(axis = 1, inplace = True) == 특정 컬럼에 결측치 있으면, 해당 컬럼 제거
3. 결측치 채우기 (fillna)
df[‘컬럼명’] .fillna(채우고 싶은 값, inplace = True)
== 채우고 싶은 값의 경우, 다른 변수를 지정해 값을 구한 뒤 넣는 경우가 많음
ex) df[‘a’].fillna(mean_A, inplace = True)
== 시계열 데이터의 경우, ‘ffill’ = 직전 자료 , ‘bfill’ = 직후 자료 를 사용하기도 한다.
ex) df[‘a’].fillna(method = ‘ffill’, inplace = True)
4. 결측치 채우기(선형보간법)
선형보간법의 경우, .interpolate()메소드 통해 채울 수 있다.
ex) df[‘a’].interpolate(method = ‘linear’, inplace = True)
● 데이터프레임 합치기
1. Concat
인덱스 값 기준, 두 df를 axis = 0 or 1로 합친다.
join = ‘outer’ 의 경우 없는 자료는 na값으로 가져오지만 , join = ‘inner’ 의 경우 없는 자료는 가져오지 않는다
[] 형태로 여러 df들을 한번에 가져올 수 있다. (merge는 불가)
ex) df = pd.concat([df_1, df_2, … ], join = ‘outer’, axis = 1)
è axis = 1이니 열별로(df를 가로로 붙인다) 합치고, df_1, df_2를 붙이며, join = ‘outer’이니 없는 자료는 na로 가져옴.
2. merge
지정한 키값(column) 기준으로 합칠 수 있음.
how = ‘outer’의 경우, 없는 자료는 na로
how = ‘inner’의 경우, 없는 자료는 가져오지 않는다.
how = ‘left’의 경우, 첫번째 df를 기준으로 key값을 구성하여 없는 값들은 na로 가져온다.
how = ‘right’의 경우, 두번째 df를 기준으로 key값을 구성하여 없는 값들은 na로 가져온다.
한번에 2개의 df만 가져올 수 있다.
ex) df = pd.merge(df_1, df_2, on = ‘기준 컬럼명’, how = ‘inner’)