PANDAS
Pandas 란?
- 데이터를 좀더 쉽게 작업할수 있게 설계된 빠르고 유연한 표현을 가능하게하는 Python 패키지
- 실용적 실제 데이터 분석을 수행하기 위한 고수준의 객체 형태를 목표로 함.
- Pandas 에는 두가지 주요 데이터 구조가 있음
- Series(1D) && DataFrame(2D)
pd.Series
시리즈의 특징
- 인덱스를 통해 데이터에 빠르게 접근할 수 있어요!
- 데이터 타입은 자동으로 설정되지만, 원하는 타입으로 변경 가능해요.
시리즈는 언제 쓰이나?
- 데이터 분석 및 조작:
- 데이터 프레임의 열 하나를 다룰 때 (df['column']).
- 특정 데이터 셋에서 1차원 데이터를 생성하거나 가공할 때.
- indexing 과 label 기반 접근:
- 기본적으로 인덱스가 있는 데이터를 다룰 때 유용합니다.
- 레이블로 데이터에 접근하여 처리 속도와 가독성을 높일 수 있습니다.
- 시계열 데이터 처리:
- 시간에 따라 변화하는 데이터를 분석할 때 유용합니다.
- 인덱스를 날짜/시간으로 설정하여 시간 기반 데이터 조작 가능.
- 간단한 통계 및 연산:
- 평균, 합계, 최대값 등 통계값을 계산할 때 유용.
- 특정 데이터 타입 처리:
- numpy 배열과 유사하지만, 인덱스를 지원하여 데이터를 더 쉽게 조작 가능.
pd.Series의 장점
- 레이블(인덱스) 기반:
- 각 데이터 값에 인덱스를 부여하여 데이터에 더 쉽게 접근 및 조작 가능.
- 인덱스를 커스텀(숫자, 문자 등)할 수 있음.
- 다양한 데이터 타입 지원:
- 숫자, 문자열, 부울, 객체 등 다양한 데이터 타입을 포함할 수 있음.
- 벡터화 연산 지원:
- numpy 배열처럼 벡터화된 연산을 지원하여 빠르고 효율적인 데이터 조작 가능.
- 유연한 통합:
- DataFrame과 통합해 열(column)로 쉽게 변환 가능.
- 시리즈 간 연산 및 비교가 용이함.
- 누락된 데이터 처리:
- NaN 값 등 누락 데이터를 포함하여 작업 가능.
pd.Series의 단점
- 2차원 이상의 데이터 표현 불가능:
- 단순히 1차원 데이터만 표현 가능하여, 복잡한 데이터 구조를 다루는 데는 한계가 있음.
- 메모리 효율성:
- numpy 배열에 비해 더 많은 메모리를 소비.
- 특히, 레이블 기반 인덱스가 메모리 사용량을 증가시킬 수 있음.
- 연산 성능:
- numpy 배열에 비해 연산 속도가 약간 느릴 수 있음.
- 데이터가 매우 크거나 메모리가 제한된 환경에서는 비효율적.
- 고정된 인덱스:
- 인덱스를 변경하거나 조정하는 데 추가적인 연산이 필요함.
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의 장점
- 다양한 데이터 타입 지원:
- 한 데이터프레임 내에서 숫자, 문자열, 부울, 날짜 등 다양한 데이터 타입을 지원.
- 레이블 기반 데이터 접근:
- 열 이름 및 행 인덱스를 사용해 데이터를 직관적으로 다룰 수 있음.
- 풍부한 기능 제공:
- 데이터 필터링, 그룹화, 피벗 테이블, 결측값 처리 등 다양한 데이터 분석 기능 제공.
- 파일 입출력 지원:
- CSV, Excel, SQL 등 여러 형식으로 데이터를 쉽게 불러오고 저장 가능.
- 데이터 연산 및 변환:
- 열(column) 단위의 벡터화 연산과 행(row) 단위의 다양한 조작 기능 제공.
- 확장성:
- 대규모 데이터를 효율적으로 처리할 수 있고, 다른 데이터 구조와 결합도 용이.
- 시각화와의 연계성:
- matplotlib, seaborn 등의 시각화 라이브러리와 자연스럽게 연동.
pd.DataFrame의 단점
- 메모리 효율성:
- numpy 배열보다 더 많은 메모리를 사용함.
- 대규모 데이터 처리 시 메모리 부담이 커질 수 있음.
- 연산 속도:
- numpy 배열에 비해 연산 속도가 느림.
- 정교한 연산에서는 비효율적일 수 있음.
- 복잡성 증가:
- 데이터 크기가 커지거나 복잡한 변환이 필요한 경우 코드가 복잡해질 수 있음.
- 멀티스레딩 제약:
- GIL(Global Interpreter Lock) 때문에 멀티스레드 활용이 제한적임.
- 결측값 처리 비용:
- 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 사용 시점
- 메모리 절약이 필요할 때:
- 큰 데이터셋을 처리할 때 새로운 객체를 생성하지 않고, 원본 데이터를 수정하여 메모리 사용량을 줄일 수 있습니다.
- 원본 데이터 수정이 필요한 경우:
- 데이터 전처리 중에 원본 데이터프레임이나 시리즈 자체를 업데이트해야 할 때.
- 코드 간결화:
- 불필요한 변수 할당을 줄여 코드 가독성을 높이고 싶을 때
장점
- 메모리 효율성:
- 새 객체를 생성하지 않아 메모리 사용량을 줄일 수 있음.
- 직접 수정:
- 원본 데이터가 즉시 수정되므로 작업 후 별도의 할당이 필요 없음.
- 간결한 코드:
- 변수 재할당 없이 데이터프레임을 즉시 수정 가능.
단점
- 원본 데이터 손실 위험:
- 수정 작업이 원본 데이터에 직접 적용되기 때문에, 이전 데이터를 복구하려면 별도의 백업이 필요함.
- 명확성 부족:
- inplace=True를 사용할 경우, 메서드가 반환값을 생성하지 않으므로 어떤 작업이 수행되었는지 명확하지 않을 수 있음.
- 디버깅 시 변경 내용을 추적하기 어려움.
- 일관성 문제:
- 일부 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 사용을 권장하지 않는 방향으로 전환한다고 한다. 이유는:
- 데이터프레임이 변경되지 않는 듯 보이지만, 내부적으로 수정되는 작업은 디버깅과 테스트에서 혼란을 초래할 수 있음.
- 메모리 관리를 자동화하는 최적화 작업이 이루어짐에 따라, 복사본 생성의 비용이 줄어들었음.
따라서, 최신 pandas 버전에서는 반환값을 활용하는 방식이 더 권장됩니다.
'[Python 기초]' 카테고리의 다른 글
[Python] Module & Package 정리 (0) | 2024.11.27 |
---|---|
[Python-Library] NumPy 및 NumPy 관련 function 정리 (2) | 2024.11.26 |
[Python] Error & Exception 정리 (0) | 2024.11.26 |
[Python] Function(함수) 정리 (0) | 2024.11.26 |
[Python] 제어문 (Control Statements) 정리 (1) | 2024.11.26 |