본문 바로가기

프로그래밍/for AI

[Data] pandas 핵심 기능 정리

 

numpy에서 2차원 행렬 기능을 발전시킨 파이썬 라이브러리
AI 시대 데이터 전처리를 위한 필수품! 

정의 

 

구조화된 데이터의 조작과 분석을 위한 데이터 프레임 및 시리즈 객체를 제공하는 파이썬 라이브러리

 

목적

 

머신러닝 학습이나 각종 시각화 전에, 2차원 데이터를 원하는 형태로 구조화 하고 전처리 하기 위해 

 

특징
특징들 내용
데이터 조작 및 변환  데이터 선택, 필터링, 정렬, 집계 및 피벗 / 결측치 처리, 중복 제거, 데이터 형 변환
 빠른 연산 속도 NumPy의 연산 엔진 기반 / 벡터화(Vectorization) 지원
다양한 데이터 소스 지원 CSV, 엑셀, SQL 데이터베이스, JSON
데이터 시각화 연동 시각화 라이브러리 Matplotlib, Seaborn 

* 피벗 : 행과 열의 기준값을 변경하여 데이터프레임의 구조를 재구성하는 것

기능

 

### 데이터 확인 ###

- 데이터 기본적인 형태 확인 : head(), shape

print(df.head()) # 데이터 확인
print(df.shape) # 데이터 크기 확인

 

- 데이터 컬럼 개수 및 결측치 확인 : count(), isna().sum(), info()

-> na의 값은 무시하고 수행(값에 포함x)
-> 결측치 없는 데이터 확인: .info()
print(df.count()) # 컬럼별 개수
print(df.isna().sum()) # 결측치 개수
print(df.info())

 

- 분석 대상 컬럼의 데이터 수 확인(Categorical Data) : value_count()

-> 데이터 프레임의 컬럼을 하나 선택해야함.
-> 컬럼 지정(분할) : dataframe[’column name’]
-> na값은 기본적으로 제외하나, dropna = False옵션으로 포함 가능
print(df['sex'].value_counts())
print(df['deck'].value_counts(dropna = False))

 

### 데이터 그룹화 ###

- 데이터 그룹화 방법: groupby()

-> groupby만 했을 때는 SeriesGroupBy가 생성됨(컬럼 분할) → 연산 메서드 적용
-> 그룹화 기준에 [] 안에 2개 이상의 컬럼 넣을수 있음(좌측의 것이 우선순위 가짐)
print(df.groupby('sex')['survived'])
print(df.groupby('sex')['survived'].sum())

 

- 데이터 기본적인 통계값 확인 : describe()

-> series, dataframe 모두에 적용 가능
-> NaN의 값은 포함하지 않음
-> 기술 통계값 : count, mean, std, min, 25%, 50%, 75%, max -> 데이터 경향성 확인
print(df.groupby('sex')['age'].describe())

 

- 특정 통계값만 확인 : agg()

print(df.groupby('sex')['age'].agg(['min', 'median', 'max']))

 

### 데이터 처리 및 가공 ### 

- 데이터 프레임에서 특정 컬럼 뽑기 : drop()

df_drop = df.drop(['deck', 'embark_town'], axis = 1)
print(df_drop.head(3))

 

- 결측치 값에 값 넣기 (평균값)  

-> 일반적으로 평균값을 넣기는 하나 → 데이터에 따라 적절한 값 선택이 필요
결측치 처리 단계 설명
1. 결측치 탐지 (Detecting) isnull(), notnull(), info() ; 데이터 프레임 내 결측치 위치(행, 열)확인
2. 결측치 제거(Handling by Deletion) dropna() ; 결측치가 포함한 행 또는 열을 제거하여 데이터 일관성 유지
3. 결측치 대체(Handling by Imputation) fillna() ; 특정 값으로 결측치를 채워 넣어 데이터 유효성 유지
4. 결측치 보간(Interpolation) interpolate() ; 연속된 데이터의 결측치를 예측(method 선택)하여 채워넣는 것
df['age'] = df['age'].fillna(df['age'].mean())
df['age'].isna().value_counts()

 

- 데이터 프레임에 새로운 컬럼 추가하기

df['adult_true'] = df['age']>=20
print(df.head(3))

 

- 불린 인덱싱에서 False 조건 처리 : where

# ['가입일'] 연도(정수)가 2019년 이하인 경우에 ['연봉']의 값 10% 증가, 아닌경우 그대로 
df['연봉'] = df['연봉'].where(df['가입일'] > 2019, other = df['연봉']*1.1)

 

### 데이터에 접근 ### 

- 데이터 프레임의 특정 컬럼에서 데이터 뽑기 : 불린 인덱싱

조건 1개 : df[<조건입력>] 
조건 2개 and : df [(<조건1>) & (<조건2>)]
조건 2개 or : df [(<조건1>) | (<조건2>)]
* 두 조건을 &나 | 로 연결할 때 반드시 ()로 감싸야 한다. 
print(df[df['age'] == 30])
print(df[(df['age'] == 30) & (df['pay'] <= 300)]
print(df[(df['age'] == 30) | (df['pay'] <= 300)]

 

- 데이터 프레임 값에 접근 인덱서 : iloc, loc

: pandas의 데이터프레임은 기본적으로 열 이름으로 각 열에 접근한다. -> df['열 이름'] (O) vs df[1] (X)
-> iloc : 위치 기반 인덱스 접근 : 행과 열의 인덱스 값으로 접근(슬라이싱 범위를 넣으면 끝값-1 인덱스까지 포함)
-> loc : 명칭 기반 인덱스 접근 : 행과 열의 이름으로 인덱스 접근(슬라이싱 범위를 넣으면 끝값 모두 포함)
print(df.iloc[1:5, 1:5]) # 1~4행 포함 (위치기반)
print(df.loc[1:5:,'age']) # 1~5행 모두 포함 (명칭기반)

 

### 데이터 읽어오기 ###

- json array 읽어서 데이터 프레임으로 변환 : read_json()

-> json file : { } 안에 딕셔너리의 형태로 값이 저장된 형태 
-> json array : [ { }, { } ] 안에 여래개의 정보가 딕셔너리 형태로 저장되어 있는 형태 
data = '''[
    {"이름": "김철수", "나이": 25, "직업": "개발자", "연봉": 4000},
    {"이름": "이영희", "나이": 30, "직업": "마케터", "연봉": 3500}
]'''
df = pd.read_json(data) ; df