[Python] 데이터 전처리

yeji·2024년 10월 22일

Python

목록 보기
9/36

1. 불러오기&저장하기

  • VS Code
    터미널 열기 : shift + ctrl + ~
    터미널에서 판다스 설치 : pip install pandas

1) 불러오기

# 판다스 먼저 불러오기
import pandas as pd

# pd.read_excel('파일경로/파일명.확장자')

# 엑셀 불러오기
pd.read_excel('./파일명.xlsx') # ./ ==> 현재 내가 있는 위치라는 의미
# -> 만약 안되면 터미널에서 pip install openpyxl 설치

# csv 파일 불러오기
pd.read_csv('./파일명.xlsx')

2) 저장하기

df = 데이터프레임 # 저장하고 싶은 데이터

df.to_csv('./newfile.csv', index = False)

# index = False를 안하면 불러올 때 인덱스가 중복됨

2. 인덱스&컬럼

1) 인덱스

  • 데이터프레임(DataFrame) 또는 시리즈(Series)의 각 행 또는 각 요소에 대한 식별자

  • 설정을 안하면 0부터 시작이지만, 변경하면 원하는대로 설정 가능

  • 활용코드

# 특정 인덱스의 행에 접근
row = df.loc['idx2']

# 인덱스를 기준으로 데이터프레임 정렬
sorted_df = df.sort_index()

# df가 가지고 있는 특정 컬럼명을 기준으로 인덱스를 설정하기
data = df.set_index('컬럼명')

# 불러올때 인덱스 지정하기
pd.read_csv('./data/file.csv' , index_col = '컬럼정보') 
pd.read_csv('./data/file.csv' , index_col = 0) # 0부터 시작

#인덱스 확인하기
data.index

#리스트 형태를 활용해서 인덱스를 새로 입력
data.index = ['1번' , '2번' , '3번']

2) 컬럼

  • 데이터프레임(DataFrame)의 열 또는 변수
  • 활용코드
# 컬럼 출력
print(df['컬럼명'])  

#컬럼 확인하기
data.column

#리스트 형태를 활용해 컬럼명 새롭게 입력
data.column = ['축구', '농구', '배구', '야구']

# 컬럼 삭제
del df['컬럼명']

3. 데이터 확인 메소드

  • .head() : 데이터를 상위 N개 행까지 보여줌
data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌(5 이상도 입력 가능)
  • .info() : 데이터 정보 파악(인덱스, 컬럼명, 데이터 수, 데이터 타입)
data.info() 
# null 값을 확인할때도 활용
  • .describe() : 데이터 기초통계량 확인(개수, 평균, 표준편차, 사분위, 중앙값)
data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.
  • .isnull() : 결측치(null) 확인
# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !

# 결측치 제거 : dropna()
df.dropna()
  • .duplicated() : 중복 데이터 확인
# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])

# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])
  • astype() : 데이터 타입 변경
DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)

# new_dtype : 변경하고자 하는 데이터 타입 명시 (예 : int, float, str 등)

4. 데이터 선택

  • iloc : 정수 기반의 인덱스 사용
data.iloc[0,2]
#행과 열 번호를 통해 특정 데이터를 선택할 수 있음

# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2]  # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
  • loc : 레이블 기반의 인덱스 사용, 인덱스가 특정 문자인 경우
data.loc['행이름' , '컬럼명']
# 행이름과 컬럼명을 통해서도 특정 데이터를 선택할 수 있음

# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B']  # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
  • 참고) and = &, or = |, 줄바꿈 = \ 로 표현

  • 불리언 인덱싱 : 조건을 이용하여 데이터프레임에서 특정 조건을 만족하는 행을 선택하는 방법

# 'age' 열에서 30세 이상인 경우의 'name' 열만 선택
df.loc[df['age'] >= 30, 'name']

# 'age' 열에서 30세 이상이면서 'gender' 열이 'Male'인 행 필터링
df[(df['age'] >= 30) & (df['gender'] == 'Male')]

# 'gender' 열에서 'Male' 또는 'Female'인 행 필터링
df[df['gender'].isin(['Male', 'Female'])]   #isin도 많이 쓰니까 알아두기!
  • 데이터 컬럼 추가
df['컬럼명'] = data
# df라는 데이터프레임에 '컬럼명'이라는 이름의 컬럼이 추가되고,해당 컬럼에 data라는 값이 추가된다.

# 리스트 형태로 컬럼값 추가하기
df['KFC'] = [50, 10, 30]
#Tip. 행 수를 맞춰서 입력해줘야함


# 컬럼을 여러 조건 및 계산식을 통해 산출 값으로도 추가가 가능
df['ABC'] = (df['EPL'] + df['NBA']) * df['MLS'] * 2

5. 데이터 병합

1) concat

  • 데이터프레임을 위아래 혹은 좌우로 연결
  • axis : 연결하고자 하는 축 지정, 기본값은 0으로 위아래에 해당, 1으로 설정하면 좌우로 연결
  • ignore_index : 기본값은 False이며 기존의 인덱스 유지, True로 설정하면 기존 인덱스를 무시하고 새롭게 인덱스 설정
# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0)

# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)

2) merge

  • SQL의 JOIN 연산과 유사한 방식으로 데이터프레임 병합
  • how : 병합 방법을 나타내는 매개변수로 inner, outer, left, right 옵션이 있음
# 'key' 열을 기준으로 두 데이터프레임 병합
merged_df = pd.merge(left_df, right_df, on='key', how='inner')

6. 데이터 집계

1) groupby

  • 데이터프레임을 그룹화하고 그룹 단위로 데이터 분할, 적용, 결합하는 기능 제공
  • agg() : 여러 열에 대해 다양한 집계 함수 적용
# 'Category' 열을 기준으로 그룹화하여 'Value'의 연산 수행
grouped_avg = df.groupby('Category').mean() 
grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()

# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 'Value'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()

# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 각 그룹별 'Value1'과 'Value2'의 평균, 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})

2) pivot table

  • 데이터프레임에서 피벗 테이블 생성
# 피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'와 'SubCategory'를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns=['Category', 'SubCategory'], values='Value', aggfunc='sum')

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균과 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})

3) 데이터 정렬

  • sort_values() : 컬럼 기준으로 정렬
# 'Score' 열을 기준으로 오름차순 정렬
sorted_by_score = df.sort_values('Score') 

# 'Score' 열을 기준으로 내림차순 정렬
sorted_by_score = df.sort_values('Score',ascending=False) 
  • sort_index() : 인덱스를 기준으로 정렬
# 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index() 

# 인덱스를 기준으로 내림차순 정렬
sorted_by_index = df.sort_index(ascending=False) 

연습문제

Q1. 'species' 열 값이 'setosa'인 데이터 선택하기

data = iris_data.loc[iris_data['species']=='setosa']

Q2. 10부터 20까지의 행과 1부터 3까지의 열 선택하기

data = iris_data.iloc[10:21, 1:4]

Q3. total_bill이 30 이상인 데이터만 선택하기

data = tips_data[tips_data['total_bill']>=30]

Q4. 성별('sex')을 기준으로 데이터 그룹화하여 팁(tip)의 평균 계산

# 내 풀이
avg = tips_data[['sex', 'tip']].groupby('sex').mean()

# 강의 풀이
grouped_by_sex = tips_data.groupby('sex')['tip'].mean()

Q5. 'day'와 'time'을 기준으로 데이터 그룹화하여 전체 지불 금액(total_bill)의 합 계산

sum_bill = tips_data.groupby(['day', 'time'])['total_bill'].sum()

Q6. 'day' 열을 기준으로 각 요일별로 팁(tip)의 평균을 새로운 데이터프레임으로 만든 후, 이를 기존의 tips 데이터셋에 합쳐보자

# 내 풀이
day_tip = tips_data.groupby('day')['tip'].mean()
add_tip = pd.DataFrame(day_tip)
merge_df = pd.merge(tips_data, add_tip, on='day', how='left')

# 강의 풀이
avg_tip_per_day = tips_data.groupby('day')['tip'].mean().reset_index()
avg_tip_per_day.columns = ['day', 'avg_tip']
merged_data = pd.merge(tips_data, avg_tip_per_day, on='day', how='left')
  • 컬럼 명을 지정하지 않았고, index reset을 안함
profile
👋🏻

0개의 댓글