[Basic] 데이터 정제 - 자르기

고보·2024년 2월 1일

1 데이터 잘라서 추출

1-1 지정 or 슬라이싱

1-1-1 열

  • df['열이름'] => 시리즈 타입으로 추출됨
  • df[['열1', '열2', '열3']] => 해당 컬럼 여러 개를 df로 추출

1-1-2 행

  • df[불리언 배열]: True인 행만 추출
    • 조건 달아서 가능 df[df['age']>=20]
      df['age']>20으로 불리언 배열이 추출되고, 그걸 df[불리언배열]로 해당 행들을 모두 추출
    • 조건 2개 이상 달려면, ()로 꼭 구분 해야 한다. 안그러면 모호하다고 에러 뜬다.
      df[(df['year'] == 2017) & (df['month'] ==6)]
  • df[:3]: 인덱스 기준으로 0~2행만.

1-2 loc, iloc 이용

  • df.loc[행 레이블 이름, 열 레이블 이름]
    : loc은 레이블 이름으로 접근을 하기 때문에 df.loc[1:3]이면 1, 2, 3. 그리고 -1 등은 이름이 아니기에 접근 불가.
    존재하지 않는 행 번호 전달하면, valueerror.
  • df.iloc[행 정수 인덱스, 열 정수 인덱스]
    iloc은 정수 인덱스로 접근하기 때문에, 1:3이면 1이상 3미만 1, 2. 그리고 df.loc[-1] 등 음수로도 접근 가능.
    존재하지 않는 행 번호 전달하면, indexerror.
  • 다양한 방법
    • 행 정보가 디폴트. 열은 생략 가능. df.loc[0]: 0행, 모든 열을 추출
    • 행은 생략 불가능. df.loc[:, 0]: 모든 행, 0열을 추출.
    • df.loc['행 인덱스 이름', '열이름']
      df.loc[[행 인덱스 이름, 행 인덱스 이름], [열이름, 열이름]]리스트로 일일히 지정 가능
      df.loc[1:5, '열이름1':'열이름10']처럼 슬라이싱으로 지정 가능.
      df.loc[[불리언]] 가능
      df.loc[:, [2, 4, -1]] 불가능. 번호라서.
    • df.iloc[0, 0] 가능
      df.iloc[[행 인덱스 정수, 행 인덱스 정수], [2, 4, -1]] 리스트 지정 가능. 이 경우 -1은 마지막.
      df.iloc[[행 인덱스 정수, 행 인덱스 정수], list(range(2, 6, 2))] 가능.
      df.iloc[[행 인덱스 정수, 행 인덱스 정수], 2:6:2]] 슬라이싱 가능. 위와 같은 결과.
      df.iloc[:, ['year', 'pop']] 불가능. 이름이라.
  • 참고: df.loc[0]의 데이터 타입은 시리즈. df.tail(n=1)은 1행짜리 데이터프레임.
  • 데이터가 커질수록 loc이 더 유용. 숫자가 엄청 커지면 iloc으로 지정 어렵기에.

2 추가, 변경

  • 새 칼럼 추가: df['새칼럼이름'], df['새칼럼이름2'] = (시리즈1, 시리즈2)
  • 칼럼 값 변경: df['기존 칼럼 이름'] = 시리즈 or 값
  • 특정 행과 열 값 변경: df[행조건][열조건] = 값

3 행렬 삭제

  • df.drop(['열이름', '열 이름'], axis=1, inplace = True): axis=1 은 열 의미. 0이면 행. inplace=True면 원본도 이렇게 수정.
  • df.drop([0,4]) 0, 4행 삭제. 기본이 행 삭제.
  • del df['열 이름']: del 문은 python에서 객체를 삭제하는 문법. 변수, 리스트 항목, 딕셔너리 키 등 다양한 객체 삭제 가능.
    del 변수명 del 리스트명[인덱스] del 딕셔너리명['키'] 하면 각각 하나의 값들도 삭제 가능.

4 중복된 행 찾기

  • df.duplicated(subset=['열이름', '열이름'], keep=False)
    중복값이 있을 때, 그 중복값이 있는 두 번째 값부터는 True가 나오고, 중복되지 않은 값들은 False가 나온다.
  • 위와 같은 데이터프레임이 있을 때
    df.duplicated() => False만 나온다. DF 전체에 적용됐으므로, 행 전체가 중복값일 때만 해당된다. 그리고 A열에 중복값이 없다.
    df.duplicated(subset='B') False, False, True, False, True가 나온다.
    df.duplicated(subset=['B', 'C']) False, False, False, False, True가 나온다. 지정한 열의 모든 값이 중복값이어야지 True.
  • keep=False라고 하면, 첫 번째 값까지도 True로 뜬다. default는 True.
  • 활용: sum(df.duplicated()): 중복된 행은 1로 반환되므로, 중복된 행 갯수.
  • drop_duplicates(): 중복된 행 찾아서 그냥 삭제. subset, keep, inplace 모두 적용 가능.
  • 참고: df['열이름'].unique(): 시리즈에서 고윳값(중복되지 않는 값)을 numpy 배열로 return

5 값 업데이트

  • df1.update(df2): df1에서 df2와 인덱스 및 열이 일치하는 업데이트한다.

6 참고 함수

  • df.column => 열 이름의 리스트가 나온다. 참고 가능.
    df.column[0] => 첫 번째 열 이름 나온다.
    => df.column != ['year']: 불리언 배열이 나온다. 열 이름이 year이 아닌 것들만 True, year인 것만 False.
  • df.query('sex == "male"'): DF 내에서 조건 만족하는 데이터 필터링. 이때 조건은 하나의 string으로 받는다. 즉, 'sex'=='male'이 아니라 'sex == "male"'이다. 이 안에 변수를 넣을거면 @을 변수 앞에 붙인다.
  • np.where(조건, , x, y): 배열 내에서 조건을 만족하는 요소의 위치(인덱스)를 찾는 데 사용.
    np.where(df['열이름']>3): 그 열에서 3보다 큰 값만 선택
    뒤의 x, y는 입력해도 되고 안해도 됨. 입력하면, 조건에 맞는 건 x로 바꾸고, 안맞는 건 y로 바꾼다.
    np.where(welfare['sex'] == 9, np.nan, welfare['sex']): 9라는 이상치가 있으면 결측값으로 바꾸고, 아니면 기존의 값으로.
    welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female') sex가 1이면 male로, 아닌 건 female.로
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글