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)
- 필요없는 columns 제거, columns 이름 수정
- 결측치, 중복 데이터 처리(제거 혹은 변경)
- 각 데이터의 type과 범위 확인 및 변경 => 이상치 확인
- 이상치 처리(제거 혹은 변경)
- 데이터의 단위 통일, 분포 변환
- 유의미한 결과 찾기 및 columns 추가 ( label수, groupping 등 )
- (선택) sampling
df = df.drop('job', axis=1) # column 이름이 job인 column 삭제
# 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) 확인
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) 확인
데이터의 분포 확인
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로 변경
img = img/255
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에 저장
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()
df.groupby(["기준 변수"]).연산함수
df.groupby(["기준 변수1", "기준 변수2"])["계산 할 변수"].연산함수.unstack() # df로 나타내기 위해서 unstack()
pd.pivot_table(df, index = ["기준변수"], values = ["계산할 변수"], aggfunc = "연산")
pd.pivot_table(df, index = ["기준 변수1", "기준 변수2"], values = "계산 할 변수", gaafunc = "연산")
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()
sample = df[df['label']==0].sample(sample_size//2)
sample = sample.append(df[df['label']==1].sample(sample_size//2))
참고
#06-Pandas(판다스) 데이터 전처리, 추가, 삭제, 데이터 type 변환, 테디노트