Data Science/coding pratice

pandas 복습 2

희스레저 2021. 2. 24. 16:52

고객의 특성 정보를 활용한 화장품 추천시스템 개발목차

-group by: 그룹별 통계(count, sum 등 함수덧붙여 사용)

-multi index

-multi index를 pivot table로 변환: unstack

-reset_index() *

 

-fillna: 결측치 채우기

-dropna: 결측치 있는 row/column 제거

-drop_duplicate: 중복치 있는 row/column 제거

 (keep: first/last 옵션 가능)

-drop: 행,열 제거

 

-데이터프레임 합치기(옆으로 합치기axis=1, 아래로 합치기sort=False)

 


Import pandas as pd

 

1) Group by : 그룹별 통계

df. groupby('소속사')         #아무것도 출력 안 됨. 추가적으로 취할 통계함수를 넘겨줘야함

 
groupby와 함께 사용하는 함수
* count() - 갯수
sum() - 합계
mean() - 평균
var() - 분산
std() - 표준편차
min()/max() - 최소값, 최대값
 
 
df.groupby('소속사').count()         #각 소속사별로 행이 몇 개인지 출력

df.groupby('소속사').mean()

mean, sum 등은 산술통계가 가능핸 열만 출력됨

 

 

** 특정 column만 소속사별로 통계치 추측

>> df.groupby('소속사')['키'].mean()

series형태로 출력됨

 

2) 복합 index (muli-index)

행 index의 단계가 복합적으로 두 개 이상 구성할 때

ex) 데이터를 그룹으로 묶을 때 혈액형별, 그 중에서도 성별 별로 키의 평균보기

>> df.groupby(['혈액형', '성별']).mean()


2-1) 복합 index 데이터를 피벗테이블로 변환하기

df2 = df.groupby(['혈액형', '성별']).mean()

 

df2.unstack('혈액형')        **혈액형을 기준으로 옆으로 풀어냄

(피봇테이블 형식처럼 데이터를 옆으로 펼쳐줌, index(행)에 있던 것을 column으로)

좌(혈액형으로 unstack), 우(성별으로 unstack)

 

3) reset_index : 인덱스 초기화

복합 index로 구성된 데이터 프레임의 인덱스를 초기화해줌

데이터 통계를 groupby로 묶어 확인한 다음 요약된 통계본을 따로 데이터프레임으로 만들어 활용할 때 많이 쓴다.

 

df2.reset_index()

 

 

4) 결측치 채우기 fillna()

df['키'].fillna(-1)        **()안에 채워주고 싶은 값

채우고 난 후 유지하려면? inplace = True / df['키'] = df['키'].fillna(-1)

 

*추천하는 방식

df2 = df.copy()

df2['키'] = df2['키'].fillna(-1)

inplace = True 값 줘도 되지만 이렇게 변수에 새로 대입해주는 것을 추천...

 

** 결측치 평균값으로 채우기

df2 = df.copy()

height_mean = df2['키'].mean()

df2['키'].fillna(height_mean, inplace=True) /  df2['키'] = df2['키'].fillna(height_mean)

 

 

5) NaN값 있는 행 제거: dropna()

5-1) axis (열/행)

 aixs = 0 <기본값>  aixs = 1 
행 드랍 열 드랍
df.dropna(axis=0) df.dropna(axis = 1)

5-2) how 옵션 : any, all

df.dropna(axis=o, how='all')          **모든 행 값이 NaN 값일 때 행을 삭제

df.dropna(axis-0, how='any')         **하나의 값이라도 NaN일 때 행을 삭제 <기본값>

 

*행을 전부 NaN값으로 채우기

import Numpy as np

df.iloc[10] = np.nan                   (10번째 행의 값을 전부 nan값으로 채우기)

df.dropna(axis = 0, any='all')        (dropna 옵션을 all로 줘서 삭제되는지 확인)

 

 

6) 중복값 제거 : drop_duplicates()  *inplace=True 안됨, keep 옵션

첫번째 나온 값은 유지, 두번째 값부터 삭제(nan값도 첫번째는 유지, 두번째는 삭제)

 

6-1) column의 중복값 제거

df['키'].drop_duplicates()

*keep='first' (기본값), last로 줄 경우 두번째 값으로 유지됨

df['키'] = df['키'].drop_duplicates(keep='last')

df['키'] = df['키'].drop_duplicates(keep='first')

두번째 나온 값 삭제, df['키']가 아닌 df를 조회했기 때문에 nan값은 중복삭제 안됨

 

6-2) 행 전체 제거: 중복값 가지는 행 전체를 삭제

df.drop_duplicates('그룹')          **행 전체를 제거하는데, '그룹'이라는 열에서 값이 겹치면 해당되는 행을 전삭한다

*keep 조건 사용 가능

 

 

7) 행/열 제거

7-1) 행(row) 제거 : df.drop(index, axis=0)               **index number명시(1, 3)

df.drop([1,3], axis=0)

7-2) 열(column) 제거: df.drop('이름', axis=1)          **컬럼이름 명시('이름')

df.drop(['그룹', '소속사'], axis=1)

 

 

8) DataFrame 합치기 : pd.concat(단순히 합치기)      **sort=False, drop=True

8-1) row 기준 합치기 (위아래)

df2 = pd.concat([df, df_copy], sort=False)

*row 기준으로 합칠때는 sort=False를 주어 순서를 유지시킨다.

 

합치긴 했는데 인덱스가 이상함

이 때, 인덱스가 꼬일 수 있음

*df2.reset_index()

 

중요하다고 생각해서 index column을 생성해준다함...

*df2.reset_index(drop=True)            **새로운 인덱스열 삭제하는 옵션

 

8-2) column 기준 합치기(옆으로): axis = 1 옵션을 주면 된다

pd.concat([df, df2], axis=1)

 

* 행의 갯수가 맞지 않는 상태에서 column concat 할 경우

빈 부분은 nan 값으로 들어가게 된다.