[Python 기초]

[Python-Library] Pandas 과 Pandas 관련 function 정리

dyk98 2024. 11. 26. 21:07

PANDAS

Pandas 란?

  • 데이터를 좀더 쉽게 작업할수 있게 설계된 빠르고 유연한 표현을 가능하게하는 Python 패키지
  • 실용적 실제 데이터 분석을 수행하기 위한 고수준의 객체 형태를 목표로 함.
  • Pandas 에는 두가지 주요 데이터 구조가 있음
    • Series(1D) && DataFrame(2D)

pd.Series

시리즈의 특징

  • 인덱스를 통해 데이터에 빠르게 접근할 수 있어요!
  • 데이터 타입은 자동으로 설정되지만, 원하는 타입으로 변경 가능해요.

시리즈는 언제 쓰이나?

  • 데이터 분석 및 조작:
    • 데이터 프레임의 열 하나를 다룰 때 (df['column']).
    • 특정 데이터 셋에서 1차원 데이터를 생성하거나 가공할 때.
  • indexing 과 label 기반 접근:
    • 기본적으로 인덱스가 있는 데이터를 다룰 때 유용합니다.
    • 레이블로 데이터에 접근하여 처리 속도와 가독성을 높일 수 있습니다.
  • 시계열 데이터 처리:
    • 시간에 따라 변화하는 데이터를 분석할 때 유용합니다.
    • 인덱스를 날짜/시간으로 설정하여 시간 기반 데이터 조작 가능.
  • 간단한 통계 및 연산:
    • 평균, 합계, 최대값 등 통계값을 계산할 때 유용.
  • 특정 데이터 타입 처리:
    • numpy 배열과 유사하지만, 인덱스를 지원하여 데이터를 더 쉽게 조작 가능.

pd.Series의 장점

  1. 레이블(인덱스) 기반:
    • 각 데이터 값에 인덱스를 부여하여 데이터에 더 쉽게 접근 및 조작 가능.
    • 인덱스를 커스텀(숫자, 문자 등)할 수 있음.
  2. 다양한 데이터 타입 지원:
    • 숫자, 문자열, 부울, 객체 등 다양한 데이터 타입을 포함할 수 있음.
  3. 벡터화 연산 지원:
    • numpy 배열처럼 벡터화된 연산을 지원하여 빠르고 효율적인 데이터 조작 가능.
  4. 유연한 통합:
    • DataFrame과 통합해 열(column)로 쉽게 변환 가능.
    • 시리즈 간 연산 및 비교가 용이함.
  5. 누락된 데이터 처리:
    • NaN 값 등 누락 데이터를 포함하여 작업 가능.

pd.Series의 단점

  1. 2차원 이상의 데이터 표현 불가능:
    • 단순히 1차원 데이터만 표현 가능하여, 복잡한 데이터 구조를 다루는 데는 한계가 있음.
  2. 메모리 효율성:
    • numpy 배열에 비해 더 많은 메모리를 소비.
    • 특히, 레이블 기반 인덱스가 메모리 사용량을 증가시킬 수 있음.
  3. 연산 성능:
    • numpy 배열에 비해 연산 속도가 약간 느릴 수 있음.
    • 데이터가 매우 크거나 메모리가 제한된 환경에서는 비효율적.
  4. 고정된 인덱스:
    • 인덱스를 변경하거나 조정하는 데 추가적인 연산이 필요함.

pd.Series vs. numpy.array

특징 pd.Series numpy.array

인덱스 레이블 기반 (사용자 정의 가능) 정수 기반
데이터 타입 혼합 가능 단일 타입
메모리 사용 더 높음 더 적음
연산 속도 약간 느림 더 빠름
누락 데이터 처리 지원 (NaN) 지원하지 않음

그러기에 ..

pd.Series는 레이블 기반의 데이터 분석 작업에 필수적이며, 유연성과 사용 편의성이 뛰어난 반면, 대규모 데이터 처리에서는 numpy 등의 대안이 더 나을 수 있다.

Data Frame

  • 데이터 프레임(DataFrame)은 2차원의 표 형태 데이터 구조.
  • 엑셀의 전체 시트(sheet) 와 비슷
  • 여러 개의 시리즈(Series)가 모여서 만들어짐.
# 예시: 데이터 프레임 생성
data = {
    '이름': ['철수', '영희', '민수'],
    '나이': [25, 30, 35],
    '직업': ['학생', '회사원', '프리랜서']
}

df = pd.DataFrame(data)
print(df)

Data Frame 특징

  • Row and Column ⇒ 2D data
  • various type
  • Can access by index and column name
  • 구조화된 데이터 처리:
    • CSV, Excel, SQL, JSON 등으로부터 읽어온 데이터를 처리할 때.
    • 행과 열로 구성된 데이터를 가공하거나 시각화할 때.
  • 데이터 분석 및 통계 처리:
    • 데이터 요약, 집계, 그룹화, 필터링, 정렬 등 다양한 작업 수행.
    • 각 열이 서로 다른 데이터 타입을 가질 수 있어 유연함.
  • 데이터 조작 및 변환:
    • 데이터 정리, 결합, 분리, 피벗 테이블 생성, 결측값 처리 등 다양한 데이터 전처리 작업.
  • 멀티 인덱스 작업:
    • 복잡한 데이터 구조(예: 계층적 인덱스)를 표현하고 다룰 때.
  • 시계열 분석:
    • 시간 데이터를 인덱스로 설정하여 시계열 데이터를 다룰 때 유용.
  • 머신러닝 및 데이터 모델링:
    • 피처(열)와 샘플(행)을 직관적으로 나타내는 데이터 구조로, 머신러닝 입력 데이터로 자주 사용.

pd.DataFrame의 장점

  1. 다양한 데이터 타입 지원:
    • 한 데이터프레임 내에서 숫자, 문자열, 부울, 날짜 등 다양한 데이터 타입을 지원.
  2. 레이블 기반 데이터 접근:
    • 열 이름 및 행 인덱스를 사용해 데이터를 직관적으로 다룰 수 있음.
  3. 풍부한 기능 제공:
    • 데이터 필터링, 그룹화, 피벗 테이블, 결측값 처리 등 다양한 데이터 분석 기능 제공.
  4. 파일 입출력 지원:
    • CSV, Excel, SQL 등 여러 형식으로 데이터를 쉽게 불러오고 저장 가능.
  5. 데이터 연산 및 변환:
    • 열(column) 단위의 벡터화 연산과 행(row) 단위의 다양한 조작 기능 제공.
  6. 확장성:
    • 대규모 데이터를 효율적으로 처리할 수 있고, 다른 데이터 구조와 결합도 용이.
  7. 시각화와의 연계성:
    • matplotlib, seaborn 등의 시각화 라이브러리와 자연스럽게 연동.

pd.DataFrame의 단점

  1. 메모리 효율성:
    • numpy 배열보다 더 많은 메모리를 사용함.
    • 대규모 데이터 처리 시 메모리 부담이 커질 수 있음.
  2. 연산 속도:
    • numpy 배열에 비해 연산 속도가 느림.
    • 정교한 연산에서는 비효율적일 수 있음.
  3. 복잡성 증가:
    • 데이터 크기가 커지거나 복잡한 변환이 필요한 경우 코드가 복잡해질 수 있음.
  4. 멀티스레딩 제약:
    • GIL(Global Interpreter Lock) 때문에 멀티스레드 활용이 제한적임.
  5. 결측값 처리 비용:
    • NaN 값을 처리하거나, 누락된 데이터를 조작할 때 추가적인 연산 비용이 발생.

pd.DataFrame vs. pd.Series

특징 pd.DataFrame pd.Series

차원 2차원 테이블 (행, 열) 1차원 배열 (열 하나)
데이터 타입 여러 열에서 서로 다른 타입 가능 단일 데이터 시리즈
데이터 접근 행과 열 레이블 모두 사용 가능 인덱스만 사용
응용 가능성 복잡한 데이터 분석 및 가공 가능 간단한 데이터 조작

예시

import pandas as pd

# 데이터프레임 생성
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Score': [90, 85, 95]
}

df = pd.DataFrame(data)

# 열 접근
print(df['Name'])  # Name 열 출력

# 행 접근
print(df.loc[0])  # 첫 번째 행 출력

# 데이터 통계 요약
print(df.describe())  # 숫자 열의 요약 통계 출력

# 필터링
filtered_df = df[df['Age'] > 28]  # Age가 28보다 큰 행 선택
print(filtered_df)

pd.DataFrame은 구조화된 데이터 처리와 분석의 중심이 되는 데이터 구조.

  • 장점으로는 유연성과 풍부한 기능을 들 수 있지만, 메모리 및 속도 면에서 대규모 데이터 작업 시 numpy 등 다른 대안이 필요할 수 있습니다.
  • 다양한 데이터 소스에서 데이터를 가져와 분석하거나, 머신러닝 모델의 입력 데이터 처리에 가장 적합.

Function: inplace

inplace 는 언제 사용되나?

inplace 사용 시점

  1. 메모리 절약이 필요할 때:
    • 큰 데이터셋을 처리할 때 새로운 객체를 생성하지 않고, 원본 데이터를 수정하여 메모리 사용량을 줄일 수 있습니다.
  2. 원본 데이터 수정이 필요한 경우:
    • 데이터 전처리 중에 원본 데이터프레임이나 시리즈 자체를 업데이트해야 할 때.
  3. 코드 간결화:
    • 불필요한 변수 할당을 줄여 코드 가독성을 높이고 싶을 때

장점

  1. 메모리 효율성:
    • 새 객체를 생성하지 않아 메모리 사용량을 줄일 수 있음.
  2. 직접 수정:
    • 원본 데이터가 즉시 수정되므로 작업 후 별도의 할당이 필요 없음.
  3. 간결한 코드:
    • 변수 재할당 없이 데이터프레임을 즉시 수정 가능.

단점

  1. 원본 데이터 손실 위험:
    • 수정 작업이 원본 데이터에 직접 적용되기 때문에, 이전 데이터를 복구하려면 별도의 백업이 필요함.
  2. 명확성 부족:
    • inplace=True를 사용할 경우, 메서드가 반환값을 생성하지 않으므로 어떤 작업이 수행되었는지 명확하지 않을 수 있음.
    • 디버깅 시 변경 내용을 추적하기 어려움.
  3. 일관성 문제:
    • 일부 pandas 메서드(예: sort_values, reset_index)는 inplace를 지원하지만, 모든 메서드가 이를 지원하지 않음.

inplace=True

import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# inplace=True로 데이터프레임 수정
df.drop('Age', axis=1, inplace=True)  # 'Age' 열 삭제
print(df)
# 출력:
#       Name
# 0    Alice
# 1      Bob
# 2  Charlie

inplace=False (기본값)

data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# inplace=False로 새로운 객체 반환
df_new = df.drop('Age', axis=1)
print(df_new)  # 'Age' 열이 삭제된 새 데이터프레임
print(df)      # 원본 데이터프레임은 변경되지 않음

inplace를 사용하는 주요 pandas 메서드

메서드 설명

drop 행/열 삭제
fillna 결측값 채우기
replace 값 치환
rename 행/열 이름 변경
sort_values 데이터 정렬
reset_index 인덱스 초기화

inplace Usage

  • 작업이 단순하거나 원본 데이터를 즉시 수정해야 한다면 inplace=True를 사용할 수 있습니다.
  • 그러나 복잡한 파이프라인 작업이나 디버깅이 필요한 경우에는 새로운 객체를 반환하는 방식(inplace=False)이 더 명확하고 안전합니다.

TMI

pandas 개발 팀은 최근 inplace 사용을 권장하지 않는 방향으로 전환한다고 한다. 이유는:

  1. 데이터프레임이 변경되지 않는 듯 보이지만, 내부적으로 수정되는 작업은 디버깅과 테스트에서 혼란을 초래할 수 있음.
  2. 메모리 관리를 자동화하는 최적화 작업이 이루어짐에 따라, 복사본 생성의 비용이 줄어들었음.

따라서, 최신 pandas 버전에서는 반환값을 활용하는 방식이 더 권장됩니다.