ㅅㅇ
Pandas _ 02-3 DataFrame 접근 _ 컬럼/행 조회 및 변경 본문
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
'AI_STUDY > Pandas' 카테고리의 다른 글
Pandas _ 03-1 정렬 (0) | 2022.06.09 |
---|---|
Pandas _ 02-4 DataFrame 접근 _ 컬럼/행의 값 조회 및 변경 (0) | 2022.06.08 |
Pandas _ 02-2 DataFrame 주요 메소드, 속성 (0) | 2022.06.08 |
Pandas _ 02-1 DataFrame 개요 & 생성 및 저장 (0) | 2022.06.07 |
Pandas _ 01-2 Series 주요 메소드 , 속성 (0) | 2022.06.07 |