ㅅㅇ

Pandas _ 02-3 DataFrame 접근 _ 컬럼/행 조회 및 변경 본문

AI_STUDY/Pandas

Pandas _ 02-3 DataFrame 접근 _ 컬럼/행 조회 및 변경

SO__OS 2022. 6. 8. 19:58
플레이데이터 빅데이터캠프 공부 내용 _ 6/8

Pandas_02-3 DataFrame 접근 _ 컬럼/행 조회 및 변경

1. 데이터 프레임의 기본 정보 조회

데이터 조회 시 루틴. 베이직하게 함.

 

- csv 파일 읽기
- shape
- info()
- head()
- tail()
- isnull().sum() => 컬럼별 null 체크    ( .sum() 한번더 하면 총개수 )
- describe()   : 숫자형-기술통계값,      문자열-총개수, 유니크값, 최빈값
- index / columns : index와, 컬럼명 조회.
                                 columns = df.colums

                                 indexer로 반환 (리스트처럼 인덱싱, 슬라이싱 가능하다. => 변수에 담아두고 순번으로 접근가능)

                                 아래 쳅터에서 자세히.

 

import pandas as pd

# 1 csv 데이터 파일을 읽어서 DataFrame 생성. index 지정. 결측치 설정. 컬럼은 첫번째 행으로.
df = pd.read_csv('data/movie.csv', index_col = ['movie_title'], na_values=['결측치'])

# 2 행/열 수 확인
df.shape

# 3 대략 파악
df.head(10)
df.tail(10)

# 4 데이터프레임에 대한 정보 확인
df.info()

# 5 컬럼별 결측치 확인 => isnull(), isna()   => isnull().sum()   isna().sum()
                                    # bool -> sum() : True 1으로 인식. False을 0으로 인식 
                                    # DF.sum() -> 컬럼별 합계
                                    # => 컬럼별 null 갯수 
df.isnull() # 컬럼별로 시리즈 반환
df.isnull().sum() 

# 6 수치 타입 통계 확인
df.describe().T

# 7 object 타입 통계확인
df.describe(include=['object'])

# 8 컬럼명 조회. 변수 담아두기.
columns = df.colums
colums # indexer로 반환 (리스트처럼 인덱싱, 슬라이싱 가능)

 

2. 컬럼이름 / 행이름 _ 조회

데이터 조회가 아니라 컬럼과 행의 이름 자체를 조회

 

- 컬럼, 인덱스 조회 결과 반환 값은 인덱스객체이다.

   => 리스트 처럼 쓸 수 있다. 

   => 둘다 인덱싱, 슬라이싱 가능하다. 순번으로 

 

(1) DataFrame객체.columns
    - 컬럼명 조회
    - 컬럼명은 차후 조회를 위해 따로 변수에 저장하는 것이 좋다. 순번으로 조회가능하게 만들어 준다.

# 컬럼명 조회.
df.columns

# 인덱싱, 슬라이싱 조회 가능
df.columns[0]
df.columns[:5]

- 조회 예시 ( 조회 결과 반환값인 인덱스객체를 인덱싱, 슬리아싱 가능한 것.)

Index(['color', 'director_name', 'num_critic_for_reviews', 'duration'],
      dtype='object')


(2) DataFrame객체.index
    - 행명 조회
    - index 조회는 잘 안 함.

# index 명(행) 조회
df.index

# df.index[20] # 쓸일 없다.

조회 결과 예시

   - index명을 설정한 경우 : Index로 반환
   - index명을 설정하지 않은 경우(순번을 index로 사용한 경우)  : RangeIndex 로반환. 

RangeIndex(start=0, stop=4916, step=1)

# 현재, index명 설정 안하여 순번이 index. 0부터 4915까지 1씩 증가하는 구조

 

3. 컬럼이름 / 행이름 _ 변경

데이터 값 변경이 아니라 컬럼과 행의 이름 자체를 변경

- 컬럼과 인덱스는 불변의 성격을 가짐
- columns와 index 속성으로는 통째로 바꾸는 것은 가능하나 index로 하나씩 바꾸는 것은 안된다.
    - `df.columns = ['새이름','새이름', ... , '새이름']
    - `df.columns[1] = '새이름' # 이건 안된다. `

    => 바꾸고 싶다면, 아래 메소드 .rename() 사용. 

 

grade.columns  #  Int64Index([0, 1, 2], dtype='int64')

# 컬럼명 변경 - 전체 변경
grade.colums = ['ID','Korean','Math']

# grade.colums[1] = '국어' # => error. 이렇게 쓸 수 없다.

 

 

3.1 컬럼 이름 / 행 이름 변경 관련 메소드

 

(1) 개별 컬럼 이름/ 행 이름 변경하는 메소드 .rename(딕셔너리)

 

DataFrame객체.rename(index=행이름변경설정, columns=열이름변경설정, inplace=False)

 

- 변경설정: 딕셔너리 사용
    - { '기존이름' : '새이름' ,  ..  }
    - inplace: 원본을 변경할지 여부(boolean)  기본값 False 

- 변경한 DataFrame을 반환

- 원본을 바꾸지 않는다. 그렇기에 변수에 담거나, inplace = True 매개변수 추가해주면 원본을 직접 변경한다.

 

# 특정 컬럼의 이름을 변경   columns = {현재이름:새이름}
grade.rename(columns = {'Korean':'국어','Math':'수학'}, inplace = True) # 대상(원본)을 직접 변경

# 특정 인덱스의 이름을 변경
grade.rename(index = {1:'일번'}, inplace = True )

 

 

 

(2) 특정 컬럼을 행의 index 명으로 사용   .set_index(컬럼명)

 

- 열이 index명 ( 축의 이름,  axis 이름) 이 되면서 그 컬럼은 Data Set 에서 제거된다.

- 두 개 이상의 컬럼을 index명으로 만들 경우 리스트에 컬럼명들을 묶어서 전달.

DataFrame객체.set_index(컬럼이름, inplace=False)

 

# id를 index 식별값으로 써보자 # 원본 안 바뀌기에 inplace 해주기

grade.set_index('ID', inplace = True)

DF.set_index(['state', 'fruit'])

 

 

(3) index를 첫번째 컬럼으로 복원    .reset_index()

- 특정 행이 index로 쓰고 있는 상황에서 첫 번째 컬럼을 index로 다시 쓰고 싶을 때

DataFrame객체.reset_index(inplace=False, [drop=True])

 

- index 원상복구(순번으로) 설정해줬던 기존 인덱스 열이 삭제되지 않고 데이터로 돌아감.

# 설정된 index명 제거. 순번으로 지정.
grade.reset_index()

- 매개변수 drop=True  :    index원상복구(순번으로) 설정해줬던 기존 인덱스명 열이 아예 삭제된다.

grade.reset_index(drop=True)

 

4. 행 / 열 삭제

(1) 첫 번째 방법

DataFrame객체.drop(columns, index, inplace=False)

    - columns : 삭제할 열이름 또는 열이름 리스트
    - index : 삭제할 index명 또는 index 리스트
    - inplace: 원본을 변경할지 여부(boolean)

# 하나의 열 삭제
grade.drop(columns = ['국어'])

# 다중 행 삭제
grade.drop(index = ['id-1','id-2'])

 

- 만약, 현 데이터프레임의 인덱스명이 순번일 경우에는

grade.drop(index = [1,2,4])

 

(2) 두 번째 방법

DF.drop(label = '행/컬럼명...', axis = '행 or 열 축번호')

데이터 프레임은 2차원 2개의 axis로 이뤄진 구조 

=> 행/열번호 : 행  0 axis     열   1 axis

      (5, 2)   =  (행, 열)   =  0axis, 1axis

 

# 열(컬럼) 삭제 - columns명
grade.drop(labels = ['국어'], axis = 1)

# 행 삭제 - index명
grade.drop(labels = ['id-1', 'id-2'], axis = 0)

 

4. 열 추가

- 새로운 열을 지정 후 값을 대입하면 새로운 열을 추가할 수 있다.
    - 보통 파생변수를 만들 때 사용한다.

- 없는 컬러명 : 추가.    있는 컬럼명 : 값을 변경.

- 원본에 대한 처리이다.


(1) df['새열명'] = 값
    - 마지막 열로 추가된다.
    - 하나의 값을 대입하면 모든 행에 그 값이 동일하게 대입된다.
    - 다른 값을 주려면 배열에 담아서 대입한다.

      행 개수만큼의 value를 리스트로 전달해야 한다.

      (데이터는 방대한 양이다. 실제로 직접 이렇게 하나씩 넣을 일은 없다.)

# 모든 행에 동일한 값을 대입
grade['영어']  = 0 

# 각 행마다 다른 값을 대입. 행 개수만큼의 value를 리스트로 전달해야 한다.
grade['영어'] = [80,90,90,70,56]

 

** 컬럼을 피쳐, 변수(컬럼의 값은 인덱스에 따라 달라지니깐)라고 부르기도 한다.
(2) 기존 열들의 값을 이용한(계산/처리) 새로운 열 생성 => 파생변수
    - 벡터 연산을 이용하여 값 대입
    - df[‘새열이름‘] = 기존 열들을 이용한 연산
    - 데이터를 정제하는 작업 중 하나. 자주 쓰인다.

파생 변수에 들어갈 때 시리즈의 각 행의 값들이 들어간다는 것을 이해하고 코드를 짜야 한다.!

어떤 값들이 파생 변수에 저장되어야 하는지, 시리즈가 뭔지 파악 먼저 하기

 

- ex. 파생변수 총합 추가

기존의 값으로 만든 합계 컬럼을 파생변수라 한다.

# 특정 한 개의 컬럼 값을 조회하여 Series로 반환한다.
grade['국어'] 

# 시리즈의 합은 인덱스 별로 같은 행에 있는 것끼리 더해진다. 점수의 총합을 뜻하는 시리즈 반환.
# 그리고 행에 맞춰 합계라는 컬럼에 들어가게 된다.

grade['합계'] = grade['영어'] + grade['수학'] + grade['국어'] + grade['과학']

 

- ex. 파생변수 평균 추가

  기존의 값으로 만들어준 결과 시리즈가 해당 파생변수 컬럼으로 행에 맞춰 들어간다.

# 파생변수 평균 추가
grade['평균'] = grade['합계']/4
grade

 

- ex. 패스 여부를 boolean값으로 저장하는 컬럼을 추가

  • 기준: 평균점수가 75미만이면 False,이상이면 True가 나오도록 처리
# bool 데이터 시리즈가 파생변수로 들어감.
grade['pass'] = grade.['평균'] >= 75

 

(3) numpy 로 해당 조건에 맞는 데이터가 들어간 컬럼 추가

 ** 아직은 참고

import numpy as np
# np.where(조건, 참, 거짓) # 조건이 True이면 참값. False 거짓값 => 배열로 나옴.

grade['pass2'] = np.where(grade['평균']>=75, "합격", "불합격" )

grade