본문 바로가기
국비 교육/데이터

[데이터 분석] Pandas - 2

by 육츠 2023. 11. 11.
Contents 접기

예제로 쓰이는 데이터 프레임 원본이다.

인덱싱, 슬라이싱

# df['a'] 키 에러 (열읽기)
df[['A','C']]

'a'는 행에 있는 인덱스 이름이기 때문에 df['a']로 읽어올 수 없다.  = 열의 순서를 이용해서 인덱싱 할 수 없다.
열 위치 값을 이용해서 인덱싱이나 슬라이싱을 이용하려면 columns 속성을 이용한다.

 

# df[0] # 컬럼명으로 인식하게 됨
df.columns # 컬럼의 값을 ndarray로 반환
# Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')

df.columns[0] # 'A'
# 위치값을 이용해서 컬럼 이름을 가져올 수 있다.

df[df.columns[2:4]] # 데이터 프레임 형식으로 2번째, 3번째 열을 읽어옴

 

행의 이름을 이용해서 슬라이싱을 할 수 있다 (마지막 요소까지 범위의 포함된다)
행의 순서를 이용해서도 슬라이싱을 할 수 있다. ( 위치를 이용해 행을 읽어올때에는 인덱스를 뜻하는 i를 loc앞에 붙여야 한다.)

# df['a':'c']
df.loc['a':'c'] # 행단위 추출은 loc 속성을 이용한다. # 이름

df.iloc[2:5] # 위치

 

특정 위치의 데이터 추출
- df.at, df.iat : 라벨 또는 인덱스를 이용해서 특정 위치의 데이터를 가져온다.(단일값 추출)

df.at['c','E'] # 60
# 이름 (c행 E열)

df.iat[4,4] # 43
# 위치 (4행 4열)

 

- df.loc , df.iloc: 행과 열의 라벨 또는 인덱스를 이용해서 특정 위치의 데이터를 조회한다.

df.loc[['e','a','c'],['C','C','A']]
#     C	  C	  A
# e  43  43   64
# a	 96	 96	 78
# c	 60	 60	 31

df.iloc[0:5,5:10] # 0 ~ 4 행 ,0 ~ 9열
df.iloc[0:5:2,5:10:2] #  2 : 스텝값

 

조건 인덱싱

df[df['A'] > 50] 
# df의 A열의 요소 중 50을 초과하는 값이 있을때 해당 값의 행을 선택

# 행 조건 인덱싱
df.loc[:,df.loc['b'] > 50] 
# 열의 조건 : b 행의 값이 50을 초과한 열만 

df[ df % 2 == 0] 
# 전체 데이터를 대상으로 짝수에 해당하는 것만
# 조건에 해당하지 않는 요소는 NaN 으로 표시

df[ df % 2 == 0] 의 결과

df2 에 원본 데이터를 복사 후 df2에 'K' 열을 추가한다.

df2 = df.copy()
df2['K'] = ['one','two','one','two','one','two','one','two','one','two']
df2
# 정제하는 과정에서 착오가 있었다면 다시 데이터 프레임을 불러오기 위해
# copy() 를 하여 데이터를 복제 해놓는다.

df2['K'].isin(['one']) # K 값에 one만 가지고 있는

df2[df2['K'].isin(['one'])] # 불린 인덱스

# 특정값을 포함 하지 않는 레코드 검색 : ~ 연산자 사용 (판다스_부정 연산자)
df2[ ~ df2['K'].isin(['one'])] # 마스킹 값의 T/F 통해 
# 'one'을 가지지 않은 값만 나온다.

df2[df2['K'].isin(['one','two'])] # 불린 인덱스

 

데이터 수정

df['E'] = 0
df # 데이터 조회 -> 새로운 값

# df.drop('E', axis = 0, inplace = True)
df.at['e','E'] = 1
df # 특정값 수정

df.loc['d':'f'] =0
df # 특정 행 슬라이싱으로 지정하여 수정
np.random.seed(0)
df = pd.DataFrame(np.random.randint(100, size = (10,10)), 
                  index= list('abcdefghij'), columns= list('ABCDEFGHIJ'))
df

새로운 데이터프레임 생성

seed(0)을 통해 교육을 들으며 배웠지만, 잘 생각이 나지않아 검색을 해보았다. np.random.seed(0) 을 통해 난수(random number)가 발생하는 동작을 제어하는 것 뿐이다. 좀 더 자세한 설명은 참고한 밑의 사이트에 나와있다.

https://frhyme.github.io/python-libs/np_random_get_set_state/

 

np.random.seed()는 정확히 무엇을 의미하는가?

2-line summary

frhyme.github.io

 

데이터 정렬

- df.sort_values()
행 또는 열을 지정해서 값에 따라 정렬한다.
기본 값을 열을 지정해서 값에 따라 오름차순으로 정렬하는 것이다.
내림차순으로 정렬하려면 ascending 인수에 False 를 전달한다.
행을 지정해서 정렬하려면 axis 인수에 1 또는 'columns'를 전달한다.

# df.sort_values('a') # 기본값은 열을 지정해서  default : axis = 0
df.sort_values('A') # A열에서 내림차순

df.sort_values('A',ascending= False) # 오름차순

df.sort_values('a', axis = 1) # 일종의 연산으로 보기 때문에 1을 넣는다.
# a 행을 기준으로 오름차순 정렬

정렬 또한 일종의 연산으로 본다. 때문에 행단위, 열단위의 축 변화에 신경써야한다.
연산 (행:1,열:0) , 연산이 아닌 상황(행:0, 열:1)

- df.sort_index()
행 또는 열 값을 기준으로 정렬한다.
기본 값은 인덱스(행번호,행이름)를 오름차순으로 정렬하는 것이다. 컬럼명에 따라 정렬하려면 axis = 1 로 지정한다.

df.sort_index(ascending= False) # 인덱스 기준 내림차순 

df.sort_index(axis= 1, ascending= False) # 컬럼명 기준 내림차순

 

데이터 프레임 조작

새로운 행 또는 열을 추가.

- DataFrame에 새로운 열 추가
df[ 새로운 컬럼명 ] = 데이터 목록 (데이터의 목록은 DataFrame 내 다른 컬럼들의 원소와 같은 개수여야 한다.)
데이터 목록 타입: list, Series, ndarray

- DataFrame에 새로운 행 추가
df.loc[새로운 행 이름] = 데이터 목록 (데이터 목록은 기존 DataFrame 의 컬럼의 개수와 '타입'이 같아야 한다.)

# 새로운 데이터프레임 생성

import numpy as np
import pandas as pd

df = pd.DataFrame([[1,2,3],[7,8,9],[13,14,15]],
                 index= list('ABC'), columns=list('abc'))
df

 

# 1. 새로운 D행을 삽입하기 위해 컬럼의 개수와 타입을 맞추었다.
# 2. 새로운 d열을 삽입하기 위해 컬럼의 개수를 맞추었다.
3,3 데이터 프레임에 새로운  D행을 추가하며 현재 데이터프레임의 모양은 4,4 열이기 때문에 원소 4개를 넣어준 것이다.

#1.
df.loc['D'] = [19,20,21] 
df

#2.
df['d'] = [4,10,16,22]
df

 

시리즈를 이용해서 행 또는 열 추가
시리즈 객체를 이용해서 새로운 행 또는 열을 추가할때는 기존 데이터 프레임과 같은 인덱스를 갖도록 작성한다.
인덱스를 정확하게 명시하지 않으면 추가되는 요소는 NaN으로 초기화 된다.
# 1. 은 행/열인지 정확하게 지칭하지 않았기 때문에 값대신 NaN으로 표시되어진다. 

df2 = df.copy()

# 1.
df2.loc['F'] = pd.Series([31,32,33,34]) # F행이 NaN으로 표시된다.
df2

# 2.
df.loc['F'] = pd.Series([31,32,33,34], index= df.columns)
df

 

임의의 위치에 열을 삽입
df.insert(위치, 컬럼명, 값)

df.insert(1,'K',[1,1,1,1,1])
df

 

행/ 열의 변경

새로운 데이터 프레임 생성 : 열 명이 a,b,c 로 되어있는 3행 3열의 0-9까지의 정수 

df = pd.DataFrame(np.arange(1,10).reshape(3,3), columns=list('abc'))
df

 

- df.reindex()
새로운 행 또는 열을 추가한다
이때 추가되는 행 또는 열의 요소는 NaN으로 초기화 된다. (fill_value 매개변수를 통해 특정값으로 초기화 할 수 있다.)
실행 결과는 원본에 영향을 주지 않고 새로운 데이터프레임 객체를 반환한다.

df.reindex(index=[0,1,2,3], columns=list('abcd'), fill_value= 0) # 인덱스 구조를 다시 재정의 한다.

df # 원본에 영향을 주지 않음

0으로 채워진 2행 2열의 데이터 프레임으로 초기화되지만, df를 보면, 실제로 원본에 적용되어 있지 않다.

 

행 또는 열의 순서를 임의로 섞을수도 있으며 기존에 존재하던 라벨을 생략해서 행 또는 열을 삭제할 수도 있다.

df.reindex(index=[0,1],columns=['b','a'])

b열을 a열 앞에 오도록 재설정한다. 하지만 역시나 원본에 영향을 주지 않는다.

 

df.set_index()
열을 인덱스로 만든다. df.set_index(열이름, inplace= True) , inplace= True: 원본을 변경하는 속성

df.set_index('a', inplace = True)

df.set_index() 도 원래는 실제로 원본이 바뀌지는 않지만, ' inplace = True ' 라는 요소를 넣게 되면 실제로 원본이 바뀌게 된다.
=> 기본값이 inplace = False 로 되어있다는 의미이다.

 

df.reset_index()
인덱스를 열 데이터로 추가한다. 인덱스 초기화: drop = True 인수를 전달하면 기존 인덱스를 삭제하고 기본값으로 다시 초기화한다.

df.reset_index()

df.reset_index(drop= True)

 

행/열의 삭제
실행 결과는 원본에 영향을 주지 않고 새로운 데이터 프레임을 반환한다. (inplace = False 가 기본값)

df = pd.DataFrame([[1,2],[3,4]], index= ['A','B'], columns= ['a','b'])
df

 

새로운 데이터 프레임 생성

열 제거
del df[컬럼명]
일반적으로는 df.drop()
df.drop(컬럼명 목록, axis = 1) default = 0 (행삭제) , df.drop(columns=컬럼명 목록) 축 옵션을 주지 않아도 된다.

행 제거
df.drop(행명 목록), axis = 0 이 기본값이므로 생략해도 된다.
df.drop(rows = 행명 목록)

# df.drop('a') # 행 삭제로 인식
df.drop('A') # 행 삭제

df.drop('a', axis= 1) # 열 삭제

삭제에서의 축값은 원래 축값의 의미로 사용한다.

 

행/열 이름 바꾸기

df = pd.DataFrame(np.random.randint(1,100,(4,4)))
df

 

새로운 데이터 프레임 생성( 4행 4열로 구성된 데이터 프레임에 정수로 된 난수를 넣는다.)

df.columns =['C1','C2','C3','C4'] 
df.index = list('abcd')
df

 df.columns, df.index 를 이용하여 값만 뽑아와 새로 대입시킨다.

특정 행/열 이름만 바꾸기 
df.rename( index= dictionary 객체) dictionary{기존 이름 : 새로운 이름}
df.rename( columns= dictionary 객체)
새로운 데이터 프레임 반환 > 즉 원본을 변경 시키지 않는다.

df.rename(index={'a':'A'}, inplace= True)
df.rename(columns={'C1': '국어'}, inplace= True)
df

딕셔너리 방식을 이용하여 {기존이름: 새로운이름}, 'inplace = True' 를 적어 원본에 적용시킨다.

컬럼 이름 특정 문자 바꾸기

df.index = list('ABCD')
df.columns = ['1기 A반', '1기 B반', '2기 A반', '2기 B반']
df

국어, C2,C3,C4 로 되어있는 칼럼명을 새로  변경, 인데스 값도 A, B, C, D 로 변경시킨다.

str 모듈은 문자열을 다루는 함수를 가지고 있다. (파이썬의 함수)

df.columns = df.columns.str.replace(' ','_')
df

 

str 모듈은 문자열을 다루는 함수를 가지고 있다. (파이썬의 함수)

 

컬럼명에 접두사 및 접미사를 붙이기
df.add_prefix() : 접두사 / df.add_suffix() : 접미사

df = df.add_prefix('KDM')
df

접두사 즉, 컬럼명인 1기 *반 앞에 KDM을 붙인다.

'국비 교육 > 데이터' 카테고리의 다른 글

[데이터 분석] Padas - 4  (0) 2023.11.11
[데이터 분석] Pandas - 3  (0) 2023.11.11
[데이터 분석] Pandas - 1  (0) 2023.11.11
[데이터 분석] Numpy - 4 (실습문제)  (0) 2023.11.08