[TIL] Pandas 데이터 처리

하나·2022년 2월 20일
0

TIL

목록 보기
7/14
post-thumbnail

loc

df.loc[행,열]

df.loc[:,[’이름',’생년월일']] : 모든 행에 이름, 생년월일 열

df.loc[3:8,[’이름',’생년월일']] : 3번부터 8번까지 행, 이름, 생년월일 열

df.loc[2:5,’이름':’생년월일'] : 2번부터 5번까지 행, 이름부터 생년월일까지의 열

iloc (position 으로 색인)

df.iloc[:, [0,2]] : 0번째와 2번째 열

df.iloc[1:5,[0,2]] : 1번째부터 4번째 행, 0번째와 2번째 열

특정 조건 만족하는 열 뽑기

df.loc[ df[’키'] > 180, ‘이름':’성별' ] : 키 column 이 180 초과인 ‘이름'부터 ‘성별'까지의 열

df.loc[ df[’키'] > 180, [‘이름':’키'] ] : 키 column 이 180 초과인 ‘이름'과 ‘키'의 열

isin을 활용한 색인

조건을 걸고자 하는 값이 정의한 list에 있을 때만 색인하려는 경우 사용

my_list = [’하나', ‘둘']

df[’숫자'].isin(my_list): 숫자 column에 값이 my_list 의 값 중 한개이면 True

df.loc[df[’숫자'].isin(my_list)] : 위 boolean 에 True 인 값들만 색인

df.loc[df[’숫자'].isin(my_list),’숫자'] : 그 중에 숫자 column 만 색인

결측값 NaN

비어있는 값

pandas 에서는 NaN으로 표기

df.info() 로 확인 할 수 있음

df.isna() : 비어 있는 값은 True 가 리턴 되는 값이 NaN

df[’숫자'].isnull() : 숫자 column 에 비어있는 값은 True를 반환

df[’숫자']df[’숫자’].isna()] : Nan값만 색인

df[’숫자']df[’숫자’].isnull()] : 위와 동일

NaN이 아닌 값에 대하여 Boolean 인덱싱

df[’숫자'].notnull() : 비어있지 않은 값이 True 로 반환

df[’숫자']df[’숫자'].notnull()] : True 를 반환하는 값들만 색인

df.loc[df[’숫자'].notnull()] : 비어 있지 않은 값들 색인

row, column 추가 및 삭제

  1. row 추가

    df.append({’이름': ‘하나', ‘성별' : ‘여’}, ignore_index=True)

    반드시 ignore_index=True 옵션 같이 추가

    append() 후 다시 df 에 대입해줘야 변경 값이 유지 됨.

  2. column 추가

    df[’새로운컬럼'] = ‘대입할 값’

    전부 동일한 값이 추가되면서 column 값도 추가 됨

    df.loc[df[’이름'] == ‘하나' , ’성별' ] = ‘남' : 이름 컬럼이 하나 인 사람의 성별 을 ‘남'으로 바꿈

피벗 테이블

pd.pivot_table(df, index=’이름' , columns=’성별', values=’궁극적으로 보고 싶은 데이터')

aggfun=np.mean 또는 np.sum 으로 옵션 추가 가능 - 기본값은 평균

groupby

데이터를 그룹으로 묶어서 분석할 때 사용

df.groupby(’이름').count()

  • groupby 와 함께 사용할 수 있는 메소드
    • count() : 갯수
    • sum() : 합계
    • mean() : 평균
    • var() : 분산
    • std() : 표준편차
    • min()/max() : 최소값, 최댓값

multi-index

행 인덱스를 복합적으로 구성하고 싶은 경우 인덱스를 리스트로 만든다.

df.groupby([’혈액형',’성별']).mean() : 혈액형으로 우선 나뉘고 그 안에 성별로 나뉨

reset_index

인덱스 초기화

multi-index 로 구성된 데이터 프레임의 인덱스를 초기화 시켜줌.

df.reset_index()

fillna()

df[’키'] .fillna(-1) : 누락된 키 컬럼에 -1 을 채움.

유지시키려면 inplace = True 옵션 추가

NaN 이 있는 행 제거 dropna()

빈 값이 있는 행을 제거 시키는 메소드

df.dropna()

df.dropna(axis=0) 행을 드랍

df.dropna(axis=1) 열을 드랍

  • how 옵션
    • any - 한개라도 있는 경우 드랍
    • all - 모든 데이터가 nan 인 경우만 드랍

중복된 값 제거 (drop_duplicates)

df[’키'].drop_duplicates() : 키 컬럼에 중복된 값 드랍, 첫 번째 값 유지

  • keep 옵션으로 유지하고 싶은 데이터 선택 가능
    • first - 첫 번째 값 유지
    • last - 마지막 값 유지

중복 된 값이 있으면 행 전체 제거

df.drop_duplicates(’키') : 키 컬럼에 중복된 값이 있으면 행 전체 제거

행과 열 제거 (drop)

df.drop(’키',axis=1) : 키 컬럼이 드랍

df.drop([’키',’이름'],axis=1) : 키, 이름 컬럼이 드랍

df.drop(3,axis=0) : 3번 인덱스 제거

df.drop([3,5],axis=0) : 3, 5번 인덱스 제거

DataFrame 합치기 (concat)

  1. row 기준 합치기

    pd.concat[df,df2], sort=false)

    sort 를 false로 지정해 순서가 유지되도록 한다.

    concat을 하고 나서는 reset_index 를 적용하여 인덱스를 새로 설정해준다.

    df_concat.reset_index(drop=True)

    (drop=True 옵션 설정, 새로운 인덱스가 생성되는 것을 막는다)

  2. column 기준 합치기

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

  • 행의 갯수가 맞지 않은 상태에서 concat을 하는 경우 NaN 으로 채워진다.

병합하기 (merge)

특정 고유한 키 값을 기준으로 합치기

df 와 df2 가 이름이라는 컬럼이 겹치는 경우

이름을 기준으로 dataframe 을 병합 가능

pd.merge(left, right, on=’기준 column’, how=’left)

  1. left, right 방식
    • left 데이터프레임에 키값이 존재하면 해당 데이터를 유지하고 병합한 right 데이터프레임의 값은 NaN으로 대입
    • 반대로 right 기준이면 left 데이터 프레임 값이 NaN으로 대입
  2. inner, outer 방식
    • inner : 두 데이터프레임에 모두 키 값이 존재하는 경우만 병합 (교집합)
    • outer : 하나의 데이터프레임에 키 값이 존재하는 경우 모두 병합, outer 방식에서는 없는 값은 NaN으로 대입 (합집합)
    • 두 데이터프레임에서 컬럼명이 다를 경우 기준이 되는 컬럼을 지정할 수 없기 때문에 left_on, right_on 옵션 사용
      • df.merge(df, df2, left_on=’이름',right_on=’성함', how =’outer’)

apply

series 나 dataframe 에 더 구체적인 로직을 적용하고 싶은 경우 활용

  • apply 를 적용하기 위해서는 함수가 먼저 정의되어야 함

  • apply는 정의한 로직 함수를 인자로 넘겨 줌

    df[’성별'].apply(lambda x : 1 if x ==’남자' else 0)

    : 성별 컬럼이 남자면 1, 남자가 아니면 0

map 을 이용한 값 매핑

my_map = {’남자’ : 1 , ‘여자' :0 }

딕셔너리 형태 사용

df[’성별'].map(my_map)

원핫인코딩 (One-hot-encoding)

원핫인코딩은 한개의 요소는 True, 나머지 요소는 False로 만들어 주는 기법

pd.get_dummies(’변환하고자하는 시리즈')

pd.get_dummies(df[’혈액형'], prefix=’혈액형')

prefix 옵션으로 생성된 더미 컬럼명 지정 가능

참고 : https://fastcampus.app/course-detail/205687

0개의 댓글