pandas DataFrame 생성 및 전처리 과정

Hyun·2022년 6월 16일
0

기타등등

목록 보기
7/11

pandas를 통해 DataFrame 생성

df = pd.read_csv(os.path.join(_DATA_DIR,"file.txt"), delimiter="\t")
df = pd.read_table('nsmc/file.txt')

df.shape		# 형태 확인
df.head()		# 미리 보기 (앞에서 5 row)
df.tail()		# 미리 보기 (뒤에서 5 row)

전처리

  1. 필요없는 columns 제거, columns 이름 수정
  2. 결측치, 중복 데이터 처리(제거 혹은 변경)
  3. 각 데이터의 type과 범위 확인 및 변경 => 이상치 확인
  4. 이상치 처리(제거 혹은 변경)
  5. 데이터의 단위 통일, 분포 변환
  6. 유의미한 결과 찾기 및 columns 추가 ( label수, groupping 등 )
  7. (선택) sampling

필요없는 columns 제거, columns 이름 수정

  • column 삭제
df = df.drop('job', axis=1)		# column 이름이 job인 column 삭제
  • column, index 이름 바꾸기
# column 이름 바꾸기
df.columns = ['a', 'b']
df.rename(columns = {'old_nm' : 'new_nm'}, inplace = True)	# inplace 파라미터로 df에 바로 적용 가능

# index 이름 바꾸기
df.index = ['a', 'b']
df.rename(index = {'old_nm' : 'new_nm'}, inplace = True)

df.shape 	# (row, columns) 확인

결측치, 중복 데이터 처리(제거 혹은 변경)

  • 제거
df = df[~df.document.isna()]	# 속성에 na가 있다면 제거
df = df.dropna()		# 모든 na가 있는 row 제거

# row(행) 삭제
df = df.drop(1)		# index가 1인 행 삭제
df = df.drop(df.index[:10])		# index가 9인것까지 행 삭제
df = df.drop(df.index[[0, 1, 3, 5]])		# index가 0, 1, 3, 5인 행 삭제

# column(열) 삭제
df = df.drop(columns=['age', 'class'])
df = df.drop(['age', 'class'], axis=1)

df.shape 	# (row, columns) 확인
  • 변경
# row 변경
df.loc[0, 'age'] = 10		# index가 0인 행의 age 값을 10으로 변경
# column값 변경
df_col_sum = df.sum()		# 열 축 합계
df_row_sum = df.sum(axis=1)		# 행 축 합계
df.row_sum = df.sum(axis=1)		# 행 축 합계를 df의 row_sum column에 저장

df.loc[df['sex'] == 0, 'sex'] = 'F'
df.loc[df['sex'] == 1, 'sex'] = 'M'

df.shape 	# (row, columns) 확인

각 데이터의 type과 범위 확인 및 변경 => 이상치 확인

  • 정보 나타내기
df.info()		# column별 type과 null여부, 개수 확인
df.describe()	# count, mean, std, min, 25% ... max 통계 제공
df.sex.unique()		# 성별 데이터의 종류
  • 타입 변환
df['age'] = df['age'].astype('int32')	# 한 행이라도 string이나 공백이 있다면 dtype 변환 불가

# float로 변환
df['height'] = df['height'].astype('float')
df['height'] = pd.to_numeric(df['height'], errors='coerce')	# 숫자가 아닐 경우 NaN으로 변환, dtype : float64

# string 타입은 object로 표시된다.
df['document'] = df['document'].astype('str')		# dtype : object

# category화
df['sex'] = df['sex'].astype('category')	# dtype이 category라면, category 타입이 제공하는 attribute를 사용할 수 있다.
df['sex'].cat.codes		# code화(LabelEncoder 효과)

df.shape 	# (row, columns) 확인
  • 데이터의 분포 확인

    • df.describe()
    • 시각화 : seaborn 모듈 활용
    conda install seaborn # conda를 이용한 설치, conda 대신 pip가능
    import seaborn as sns
    
    sns.boxplot(x = df['height'])		# max, min, mean 등의 통계량과 이상치 확인에 좋음, 단일 연속형 변수에 대해 수치 표시
    sns.boxplot(y = df['height'], x = df['class'])	# 단일 연속형 변수 기반 범주형 변수 분석 가능
    sns.violinplot(y = df['height'], x = df['class'])	# box plot과 비슷하다. 분포에 대한 정보도 나타낸다.
    sns.swarmplot(y = df['height'], x = df['class'])	# 데이터 포인트 수와 데이터 분포 제공
    plt.title("데이터의 분포 시각화")
    plt.show()
  • 구간 나누기

df['나뉜구간'] = pd.cut(df['height'], bins=10)	# min~max의 값을 bins만큼 분할하여 그룹화한다.
df['나뉜구간'].value_counts()		# 데이터 쏠림 현상이 있을 수 있다.

df['나뉜구간'] = pd.qcut(df['height'], q=10)	# 데이터의 분포(양, quantity)를 최대한 비슷하게 유지하며 q구간으로 분할
df['나뉜구간'].value_counts()		# 균등하게 분할됨, 간격은 일정하지 않음

이상치 처리(제거 혹은 변경)

df = df[(0<=df['age']) & (df['age']<=100)]	# age가 0 이상, 100 이하인 데이터만 사용(조건)
df["job"] = df["job"].str.replace("managers","manager")		# managers인 값을 manager로 변경

데이터의 단위 통일, 분포 변환

  • 데이터의 단위 통일 필요 ( cm, m, km 중 하나로 통일)
  • 분포 변환
    • img일 경우, 0~255값을 0~1값으로 변환(numpy라고 가정)
    img = img/255	

유의미한 결과 찾기 및 columns 추가 ( label수, groupping 등 )

  • columns 추가
df['absum'] = df['A'] + df['B']	
  • 데이터의 종류 확인
df['job'].unique()		# set(df['job'])과 동일
df1 = df[df['job'].apply(lambda x : x in ['student','manager'])]	
# job이 학생과 매니저인 데이터만 df1에 저장
  • label별 데이터 수 확인 ( label의 종류가 적을 때 )
df.label.value_counts() 
  • 시각화
    sns.histplot(x=df['height'])		# 막대그래프 히스토그램
    sns.kdeplot(x)			# 연속된 곡선 그래프 ( 밀도 추정치 )
    sns.kdeplot(x=df['height'], y=df['age'])	# y 데이터 지정 가능
    sns.distplot(x, kde=True, rug=True)
    plt.title("데이터의 분포 시각화")
    plt.show()
  • groupby : column을 기준으로 데이터 집계(pivot과 같은 결과)
df.groupby(["기준 변수"]).연산함수
df.groupby(["기준 변수1", "기준 변수2"])["계산 할 변수"].연산함수.unstack()	# df로 나타내기 위해서 unstack()
  • pivot
pd.pivot_table(df, index = ["기준변수"], values = ["계산할 변수"], aggfunc = "연산")
pd.pivot_table(df, index = ["기준 변수1", "기준 변수2"], values = "계산 할 변수", gaafunc = "연산")

sampling

  • sample을 임의 추출해 새 dataframe 생성 ( 10,000개 추출)
    • [방법 1]
sample_size = 10000
df = df.reset_index(drop=True) # Index로 iloc하기 위해서는 df의 index를 초기화해줘야 함
    
neg_idx = df.loc[df.label==0].index
neg_idx_sample = random.sample(neg_idx.to_list(), k=int(sample_size/2))

pos_idx = df.loc[df.label==1].index
pos_idx_sample = random.sample(pos_idx.to_list(), k=int(sample_size/2))

sample_df = df.iloc[neg_idx_sample+pos_idx_sample]

sample_df.shape		# (10000, 3)
sample_df.label.value_counts()
  • [방법 2]
sample = df[df['label']==0].sample(sample_size//2)
sample = sample.append(df[df['label']==1].sample(sample_size//2))

참고

#06-Pandas(판다스) 데이터 전처리, 추가, 삭제, 데이터 type 변환, 테디노트

[Python] pandas 라이브러리를 활용한 데이터 전처리 2, changhtun1

[Python] 데이터 로드 및 전처리, Yun

Seaborn - 데이터를 시각화하는 17가지 방법

0개의 댓글