TIL(4W1D)[Pandas] 데이터 전처리 총정리

최유정·2025년 1월 6일
0

1. 데이터 불러오기, 저장하기

[참고]

  • Pandas 구조
    : 원래는 행의 인덱스, 열의 인덱스로 구분하지만 부르기 쉽게 행의 인덱스를 index, 열의 인덱스를 columns라고 부름.
    • DataFrame: 2차원 배열, index와 columns
    • Series: 1차원 배열, index


1. Data 불러오기 및 저장하기

1. 불러오기

pd.read_데이터 확장자 타입("파일경로/파일명.확장자")

  • 엑셀 파일: pd.read_excel("파일경로/파일명.확장자")

  • csv 파일: pd.read_csv("파일경로/파일명.확장자")

2. 저장하기

데이터프레임 명_.to_csv("파일경로/파일명.확장자", index=bool)

  • index=False는 자동생성된 숫자 인덱스는 저장하지 않겠다는 의미.

2. 인덱스(Index)

: 각 행이나 요소에 대한 식별자.

<특징>

  • 0으로 시작하는 숫자 외에도 임의의 문자나 컬럼을 인덱스로 지정 가능.
  • 파일을 불러올 때부터 인덱스 지정 가능.
  • 고유성, 불변성, 조작 및 탐색, 정렬의 특징을 가짐

1. 기본 인덱스

: 0으로 시작하는 정수 인덱스 제공(DF 생성 시 자동으로 부여되는 index)

df = pd.DataFrame({'A': [1, 2, 3], 
				'B': ['a', 'b', 'c']})

; index와 columns의 이름을 따로 지정하지 않는 경우

2. 사용자 지정 인덱스

: 사용자가 직접 인덱스를 지정

df = pd.DataFrame({'A': [1, 2, 3], 
				'B': ['a', 'b', 'c']}, 
                index=['idx1', 'idx2', 'idx3'])

; 인덱스를 따로 지정하는 경우

3. 인덱스 활용

1. set_index(): 특정 컬럼을 인덱스로 사용.

df.set_index(인덱스로 놓을 컬럼값, drop=bool, append=bool, inplace=bool)

CODE설명
drop인덱스로 설정한 열의 기존 값을 삭제할 것인가
append기존 인덱스에 새 인덱스를 집어넣을 것인가
inplace이 결과를 최초 DF에 덮어씌울 것인가

  • 멀티인덱스(다중인덱스)도 가능함.
    df.set_index(인덱스로 놓을 컬럼값1, 컬럼값2,...)

2. reset_index(): 현재 인덱스를 0부터 시작하는 정수로 변경(기본값: drop = False)

  • 현재 인덱스 값을 컬럼으로 변경하지 않고 인덱스를 초기화 가능

data.reset_index(drop=True)

3. .index: 인덱스 확인 및 새로운 입력

#인덱스 확인
df.index       #결과: RangeIndex(Start=0, Stop=4, Step1)

# 새로운 인덱스 입력
df.index=['1번','2번','3번']

4. .T(): 기존 인덱스와 컬럼을 전치해서 반환


5. reindex(): 인덱스의 순서를 변경.

  • 하나의 DF에서 원하는 컬럼만 가져와서 기존의 DF 인덱스에 지정할 수도 있음. 마치 슬라이싱한 것과 같은 효과.

df.reindex(index=배열, columns=배열, fill_value=값)

df1.reindex(columns=df2.columns)

6. rename(): 인덱스의 이름 변경

df.rename(index={old:new}, columns={old:new})

3. 컬럼(Columns)

: 각 컬럼은 series 객체를 뜻하기도 함. 열의 데이터에 접근하고 조작할 수 있는 인터페이스를 제공.

1. 컬럼 출력

df['컬럼 이름']

2. 컬럼 변경

1. name: 파일 불러오기와 동시에 컬럼 변경 가능.

pd.read_csv('파일경로/파일명.확장자', name==['컬럼1','컬럼2',...,컬럼n])

2. .column: 기존 DF의 컬럼명 변경

data.column = ['축구', '농구', '배구', '야구']


2. 데이터 확인

1. head()

: 데이터를 N개 행까지 출력. ()안에 정수를 입력하고 출력하면 정수 갯수만큼 데이터값을 보여줌.

data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌

2. info()

: 인덱스, 컬럼명, 컬럼의 데이터 갯수, Null 값, 데이터 타입 등 데이터의 정보를 파악할 때 사용.

3. describe()

: 데이터의 기초통계량(개수, 평균, 표준편차, 사분위, 중앙값) 확인

4. 데이터 확인 과정

1. 결측치 확인 및 제거

  • isnull()
    df.isnull().sum()

  • dropna()
    df.dropna()

2. 중복 데이터 확인 및 제거

df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])

3. 이상치 처리

# IQR (Interquartile Range) 방법 찾아보기
# 참고 : https://www.scribbr.com/statistics/interquartile-range/

# IQR 계산
Q1 = df['컬럼1'].quantile(0.25)
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

4. 데이터 타입 확인 및 변경

  1. astype(): DF에서 열의 데이터 타입 변경에 사용

DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)

데이터 타입(Data Type)설명(Description)예시(Example)
int64, int32정수형 데이터 (64비트 또는 32비트)1, 42, -10, 1000
float64, float32부동 소수점 수 (64비트 또는 32비트)3.14, -0.001, 2.718
object문자열 데이터 (일반적으로 문자열)'Hello', 'Data Science'
bool불리언(참/거짓) 데이터True, False
datetime64날짜와 시간 데이터'2023-12-31 08:00:00'
timedelta64시간 간격(두 날짜 또는 시간 사이의 차이) 데이터'3 days', '2 hours'
category카테고리형 데이터 (제한된 고유 값으로 구성)'Red', 'Blue', 'Green'


3. 데이터 선택(인덱싱, 슬라이싱)

1. iloc()

: 정수 기반 인덱스
df.iloc[행 번호, 열 번호] * 여러 개 선택 시, 리스트로 묶어서 기입

selected_data = df.iloc[1:4, 0:2]  # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택

2. loc()

: 레이블 기반 인덱스
df.loc["행 이름", "열 이름"] * 여러 개 선택 시, 리스트로 묶어서 기입

selected_data = df.loc['b':'d', 'A':'B']  # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택

3. 불리언 인덱싱(Boolean indexing)

: 특정 조건을 만족하는 데이터 선택 시, 불리언 값을 가지는 조건식을 이용해 행을 선택하는 방법. '필터링'을 가능하게 하는 방법.

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

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

(cf) 논리 연산자

ANDORNOT
&vertical bar(shift+\)~

1. isin()

: 시리즈, DF 값들 중에서 특정 값이나 리스트 안에 포함된 값들을 찾아내 불리언 값을 반환. 원하는 조건에 해당하는 데이터를 빠르게 필터링하거나 선택 가능.

TrueFalse
값을 포함할 때값을 포함하지 않을 때
# 데이터프레임 전체에서 여러 조건을 확인하여 필터링
result = df.isin({'A': [1, 3], 'B': ['apple', 'orange']})
print(result)

2. isnull()

: 데이터 속 NaN값에 대한 불리언 값 반환.

TrueFalse
NaN일 때NaN이 아닐 때

3. dropna()

: NaN 행이나 열을 '단순 삭제'할 때 사용.

4. 행/열 삭제

1. drop()

: axis를 지정해 행이나 열을 삭제
[행=0, 열(기본값=생략 가능)=1]


4. 데이터 병합

1. concat()

: DF를 상하, 좌우로 연결.

axisignor_index
연결하고자 하는 축(방향) 지정[상하(기본)=0, 좌우=1])연결된 결과 DF의 인덱스 유지[기본=False, 기존 인덱스 무시하고 새로운 인덱스 생성=True]

vertical = pd.concat([df1, df2], axis=0)
horizontal = pd.concat([df1, df2], axis=1)



2. merge()

: DF를 좌우로 연결. 주로 두 개 이상의 데이터프레임에서 공통된 열이나 인덱스를 기준으로 데이터를 병합할 때 활용. (SQL의 JOIN과 유사)

<주요 매개변수>

1. how: 병합 방법을 나타내는 매개변수

  • left
  • right
  • inner
  • outer

2. on: 병합할 열 이름이 다른 경우에 사용

import pandas as pd

# 두 개의 데이터프레임 생성
left_df = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
right_df = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

# 'key' 열을 기준으로 두 데이터프레임 병합
merged_df = pd.merge(left_df, right_df, on='key', how='inner')

print(merged_df)


5. 데이터 집계

1. groupby()

: DF를 그룹화하고, 그룹 단위로 데이터를 분할, 적용, 결합하는 기능 제공.

1. 그룹 생성

: 기준 열(혹은 열들-리스트로 지정해서 코드 작성)을 지정하여 데이터프레임을 그룹으로 나눔.

2. 그룹에 대한 연산 수행

: 그룹 단위로 원하는 연산(평균, 합, 개수 등)을 수행.

3. 결과 결합

: 각 그룹의 연산 결과를 하나의 데이터프레임으로 결합하여 새로운 데이터프레임을 생성.

grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()
# 샘플 데이터프레임 생성
data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value1': [1, 2, 3, 4, 5, 6],
    'Value2': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)

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

2. pivot_table()

: 데이터를 재구성하여 요약, 집계된 정보를 보여주는 테이블 형태. 하나의 칸에 여러 값이 들어갈 수 있음. 집계함수(aggfunc) 사용.

df.pivot_table(열, index[열1,..,열n], columns=[열1,...,열n], aggfunc=집계함수)

# 샘플 데이터프레임 생성
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

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

3. pivot()

: 값의 특성 상 하나의 칸에 여러 값이 들어갈 수 없는 경우, 집계함수를 사용하지 않고, pivot_table 대신 pivot 함수를 사용.

df.pivot(values=duf, index=[열1,..,열n], columns=[열1,...,열n])

  • 장점: pivot_table과는 달리, '숫자형이 아니어도 사용이 가능'하다는 것.

4. 데이터 정렬

(cf) ascednig(T/F)
: 기본값은 True(오름차순).

1. sort_values()

: 컬럼 기준으로 정렬.

2. sort_index()

: 인덱스 기준으로 정렬

3. pickle(library)

: 파이썬의 변수, 함수, 객체를 파일로 저장 후 불러올 수 있는 라이브러리.

  • binary 형태로 저장되어 파일 용량이 작아짐. 추가적으로 gzip을 이용해 저장된 데이터의 압축 가능.
    → pandas에서는 to_pickle() 및 read_pickle() 메서드를 통해 pickle을 사용할 수 있음.
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Column1': [1, 2, 3, 4, 5],
    'Column2': ['A', 'B', 'C', 'D', 'E']
}
df = pd.DataFrame(data)

# 데이터프레임을 pickle 파일로 저장
df.to_pickle('dataframe.pkl')  # 데이터프레임을 'dataframe.pkl' 파일로 저장

# pickle 파일에서 데이터프레임 불러오기
loaded_df = pd.read_pickle('dataframe.pkl')  # 'dataframe.pkl' 파일에서 데이터프레임 불러오기
print(loaded_df)

0개의 댓글