파이썬/데이터 전처리

ML, DL학습에 필요한 Pandas 전처리 방식 모음 정리 - [데이터 전처리]

1Seok 2021. 6. 29. 18:35

Pandas 데이터프레임 표

import pandas as pd

 

 


- Pandas Series 데이터프레임 생성

pd.Series(data = list) - 리스트 데이터프레임 생성

pd.Series(data = dic) - 사전 데이터프레임 생성

a1 = {4 : 123, 9 : 456, 3:789}
a2 = [1,2,3,4,5]

t1 = pd.Series(data = a1)
t2 = pd.Series(data = a2)

 

- Pandas 데이터 프레임 생성

pd.DataFrame(data = 데이터, columns = ['열1', '열2'...],  index = ['인덱스1', '인덱스2', ....])

test = pd.DataFrame(data = [1,2,3], columns = ['test1'], index = ['a','b','c'])

Pandas 활용

열(df == 데이터프레임)

 

df['col1', 'col2']

 

df.iloc['행번호'] - 원하는 행 출력

df.loc['인덱스 이름'] - 원하는 인덱스값 출력

 

조건접근

Case 1 만약 price라는 열이 500이상인 값 출력 하고싶을 때

print(df[df['price']>=500])

 

다중조건

Case2 Price열이 500이상 1000이하의 값을 출력하고 싶을 때

print(df([df['price'] >= 500]) & (df['price'] <= 1000))

 

평균값, 중간값, 표준편차

# 평균값
df['price'].mean()

# 중앙값
df['price'].median()

# 표준편차 
df['price'].std()

# 최대값, 최소값
df['price'].max()
df['price'].min()

 

- Pandas 데이터 병합

pd.concat([ df1, df2 ] , 속성들 )

  • axis = ( 0, 1 )
    1은 열끼리 합치는 것, 0은 행끼리 합치는 것
    s1 = pd.Series([0,1], index=['a','b'])
    s2 = pd.Series([2,3,4], index=['c','d','e'])
    s3 = pd.Series([5,6], index=['f','g'])
    
    print(pd.concat([s1, s2], axis = 1))
    print(pd.concat([s1, s2], axis = 0))
  •  join = ( outer, inner )
    outer는 '합집합, inner는 '교집합

  • ignore_index = ( True, False )
    True 시, index 0 ~ (n-1) 
    print(pd.concat([s1, s2], axis = 0, ignore_index = True))
    print(pd.concat([s1, s2], axis = 0, ignore_index = False))​

 

- Pandas 데이터 삭제

df.drop(데이터, 속성)

 

df.drop(df.index[[ 0, 2 ]]) 

※ Index이름으로도 설정가능 df.drop(['index1', 'index2'])

s2 = pd.Series([2,3,4])

s2.drop(s2.index[[0,2]])

 

df.drop( columns = ['열1', '열2'], inplace = )

  • inplace = ( True, False )
    inplace True 시, 따로 변수에 저장없이 메모리에 적재되어 원본에 그대로 적용되는 방식
df.drop(columns = ['열1', '열2'], inplace = True)
df = df.drop(columns = ['열1', '열2'], inplace = False)

 

-- drop 후 index리셋

df.reset_index(drop= (True, Flase) , inplace = )

  • drop True시, 사용자에게 인덱스 세팅에 사용한 열을 삭제
a = pd.concat([s1, s2], axis = 0, ignore_index = False)
a1 = a.reset_index(drop=False)
a2 = a.reset_index(drop=True)
print(a1)
print(a2)

 

-- 결측값(nan) 데이터 

Nan 데이터 삭제하기

  • axis = (0,1)
    axis가 0이면 행 제거, 1이면 열 제거 
  • how = ( 'any', 'all' )
    'any' 일 경우 nan값이 하나만 있어도 (열, 행) 삭제
    'all' 일 경우의 모든 데이터가 nan이여야 해당 (열, 행) 삭제
  • subset = [ '열1' ]
    '열1'의 데이터가 Nan 행만 삭제.
df.dropna(axis = 1, how = 'any', subset = None)

 

 

Nan 데이터 값 채우기

df['열1'].fillna(df['열1'].mean())

# 해당 Train 데이터 셋의 label 값을 평균으로 채우고 싶을 때

# label값이 '1인' '열2의' 평균 값을 구한다 
mean1 = df[df['label1'] == 1]['열2'].mean()

# Nan값을 위의 mean1값으로 대체한다
df[df['label1'] == 1]['열2'].fillna(mean1)

 

-- 이상치 데이터 삭제

Case 1 데이터안에 이상치 값을 뽑아 삭제가 필요할 때

np.unique(list(df['열1']))

# 방식1
df[df['열1'] == 'null'].index


# 방식2
idx = []

it = list(df['열1'])
for i in range(len(it)):
	# 조건 입력 Ex. null일때
    if(it[i] == 'null'):
        해당 조건의 인덱스값 리스트에 삽입
        idx.append(i)

# 인덱스에 행 삭제후, 인덱스 리셋
df = df.drop(idx)
df = df.reset_index(drop = True)

 

-- 데이터 분리

Case 1 데이터가 ['Benz Class C', 'Audi R8', 'BMW 520d'] 이런식으로 다를 때 분류가 필요

test = ['Benz Class C', 'Audi R8', 'BMW 520d']
for i in test:
    print(i.split(' '))
    
for i in len(test):
    print(test[i].split(' ')[0])
    # split된 데이터 변경
    test[i] = test[i].split(' ')[0]

 

- 데이터 조건

2개 조건에서 찾기

Case 1 Car열에서 값이 Audi이고 가격이5만 달러가 넘는 행 출력 

df[(df['Car'] == 'Audi') & (df['Price'] >= 50000)]

 

- 데이터 타입 변환

df.['열1].astype(변환타입)

df['열1'] = df['열1'].astype(float)

Object 타입 -> float타입 변경

df.astype({'열이름 : 'float'}).dtypes

Case 1  float 타입 변경중 에러무시하고 object형의 문자열을 NaN 변환 후, 0으로 변경

s1 = pd.Series(['0','1', 'ab-'], index=['a','b','q'])
s2 = pd.Series([2,3,4], index=['c','d', 'e'])

#coerce는 문자열을 숫자형으로 변환 시 ValueError 를 무시하는 속성
s1 = pd.to_numeric(s1, errors = 'coerce')

# nan값에 원하는 값 채우기
s1 = s1.fillna(0)

 

 

- Pandas내 데이터 포함내용 찾기

df[ '열1' ]str.contains()

Case 1 데이터프레임 내의 test1열에서 'Audi를 찾고싶다!

test = pd.DataFrame(['Audi I8', 'Benz C', 'Audi R8', 'BMW 520d', 'BMW320d'], columns = ['Cars'])

# 방식1
# str.contains() 함수 사용
print(test[test['Cars'].str.lower().str.contains('audi')])


# 방식2
idx = []

for i in range(len(test['Cars'])):
    if 'audi' in test['Cars'].str.lower()[i]:
        idx.append(i)

print(idx)

- Pandas 범주형 데이터 변환 

Categorical 자료형 - 정수 기반 범주형 데이터를 표현할 수 있는 특수한 데이터형

pd.categorical()

test = pd.DataFrame(['1F', '2F', '3F', '1F', '4F', '1F', np.nan], columns = ['floor'])
test['floor'] = pd.Categorical(test['floor'])

print(test.info())
print(test)

# 갯수 카운트
print(test['floor'].value_counts().sort_index())

 

- Pandas Group 활용 데이터 분석

열의 속성을 그룹화하여 그룹핑한 데이터의 총합, 평균 등을 계산

import pandas as pd

a = ['Audi','Audi','Audi','Audi','Benz','Benz','BMW','BMW','BMW']
b = [100,200,100,100, 200,200,300,300,300]

test = pd.DataFrame(a , columns = ['Cars'])
test2 = pd.DataFrame(b , columns = ['price'])

# 데이터 합치기
a = pd.concat([test,test2], axis = 1)

Case 1. 차량 브랜드를 그룹화 하여 가격의 합을 구하고 싶을 때

b = a.groupby('Cars')
b['price'].sum()

- Pandas 정규표현식 활용

str.extract활용

import pandas as pd

a = ['90cc','100cc','120cc','over190']

test = pd.DataFrame(a, columns=['cc'])
test['new'] = test['cc'].str.extract('(\d+|\D+)')
print(test)

'(\d+|\D+)' : 문자열에서 앞에 숫자면 숫자만 출력 Or 앞이 문자면 문자만 출력하게 만듬.

 

str.contains()활용

import pandas as pd

a = ['90cc','100cc','120cc','over190']

test = pd.DataFrame(a, columns=['cc'])
print(test['cc'].str.contains('(cc)'))

 

CC가 포함된 행 True로 반환