IT/머신러닝 & 인공지능 & 데이터사이언스

[파이썬 기본 4] 머신러닝 필수 라이브러리 :: 판다스 총정리

크몽 '경매하는 개발자' 님의 경매/부동산/IT/사업 채널 2023. 10. 5. 00:47
반응형

[파이썬 기본 4] 머신러닝 필수 라이브러리 :: 판다스 총정리

머신러닝/인공지능/데이터분석에 들어가기 앞서, 공통적으로 사용되는 파이썬에 대해 계속 연재를 진행중이다.

 

<이전글>

[파이썬 기본 3] 머신러닝 필수 라이브러리 :: 넘파이

[파이썬 기본 2] 조건문(If문/else문/elif문), 반복문(while문/for문)

[파이썬 기본 1-2] 자료형(문자열/콜렉션), 함수 정의

[파이썬 기본 1-1] 초기 세팅 및 변수, 연산자, sep, input, 형변환, eval()

반응형

 

 

 


2. 판다스(Pandas)

 

 
• Python data analysis의 약어로, 데이터 사이의 관계를 쉽게 다룰 수 있도록 하는 라이브러리.

 2차원 데이터 처리를 넘파이보다 더 빠르고 효율적으로 처리 가능

Series : 칼럼이 하나(1차원)인 데이터 구조체 (단일 칼럼으로, 인덱스와 값이 한 쌍을 이루는 1차원 자료구조 객체)
  ※ 리스트는 값만 있고 인덱스가 0부터 자동 생성되는 반면, 시리즈는 사용자가 직접 인덱스를 정할 수 있음.
DataFrame : 칼럼이 여러 개(2차원)인 데이터 구조체 (엑셀이라고 보면 됨)
  – 시리즈 여러 개를 묶어서 데이터프레임을 만드므로 형태는 2차원 배열과 비슷
  – 데이터프레임은 행 인덱스, 열 이름(또는 열 인덱스), 값으로 구성.
 
»행 인덱스: 가로줄인 행(Row)을 구분하는 고유한 인덱스(개별 데이터를 식별하는 Key)
 
»열 이름: 세로줄인 열(Column)을 열 이름으로 구분
 
»(Value): 행과 열이 교차하는 곳에 저장되는 데이터
 
  pip install pandas; 명령어를 통해 라이브러리 설치 가능
 

각각의 시리즈가 합쳐져서 데이터프레임이 된다.

 

 

반응형

 

<명령어 요약>

변수 = pdSeries[1, 2, 3, 4] : [1, 2, 3, 4] 시리즈를 생성하여 변수에 저장 (대문자 주의!)

변수 = pd.Series([1,2,3], index=['a','b','c']) : [1,2,3] 시리즈를 생성하고, 인덱스를 각각 a,b,c로 지정하는 변수 저장 (대문자 주의!)

변수 = pd.DataFrame(a, column=b) : 리스트 a로 행을 만들고 열 이름은 b로 하는 데이터프레임을 생성

변수 = pd.concat([series1, series2, series3, series4], axis=1) : 여러개의 시리즈를 붙여 데이터프레임 생성 후 변수에 저장
변수.columns = ['이름', '성별', '나이', '키'] : 변수의 열 이름 정의

 *_df.info() : DataFrame을 구성하고 있는 데이터셋의 칼럼의 정보를 간략히 보여줌

df.to_csv(' 파일경로/파일명.csv ', header=True, index=False, encoding='utf-8') : 데이터프레임 .csv파일로 저장. 헤더(열이름)도 같이 저장하고, 인덱스(순번)은 따로 저장하지 않음. 인코딩 양식은 한글이 있으므로 utf-8로 저장함.

변수 = pd.read_csv('파일경로/파일명.csv', sep=',') : 파일 불러오기. 변수에 엑셀자료를 DataFrame형태로 저장, 이때 데이터프레임을 구분짓는 구분자는 ','로 한다. (csv 파일은 기본 구분자가 쉼표(,)이다. 쉼표를 구분자로 설정하지 않으면 에러남)

from google.colab import drive : 구글 드라이브 사용을 위한 라이브러리 Import 
drive.mount('/content/drive') : 구글 드라이브를 마운트 시킴

from google.colab import files : 파일 다운을 위한 라이브러리 Import
files.download('/content/drive/My Drive/file.csv') : 구글 드라이브에 파일을 PC로 다운로드

*_df : 데이터프레임 출력

 *_df.head(3) : 데이터프레임의 앞 3줄만 출력(팬시하게 출력)

 *_df.tail(3) : 데이터프레임의 끝 3줄만 출력(팬시하게 출력)

type(*_df) : 데이터프레임의 타입 확인

*_df.columns : 데이터프레임의 열 정보 확인

*_df.shape : 데이터프레임의 n행 m열 출력

*_df.info() : 데이터프레임의 행렬 상세 정보 출력

*_df.describe() : 데이터프레임의 각 열별 통계정보 출력

*.value_counts() : Series/DataFrame의 값의 유형과 갯수를 집계해줌

변수 = pd.DataFrame(list명, colums=칼럼명) :: 특정 칼럼명으로 특정 list들을 다중칼럼 자료형인 DataFrame으로 변환변수 = pd.DataFrame(ndarray명, colums=칼럼명) :: 특정 칼럼명으로 특정 ndarray들을 다중칼럼 자료형인 DataFrame으로 변환

변수 = pd.DataFrame(dict) : 딕셔너리 dict로 DataFrame 변환

변수명 = DataFrame명.values : 데이터프레임 값들을 넘파이 ndarray로 변환하여 저장함

변수명 = DataFrame명.values.tolist() : 데이터프레임 값들을 리스트로 변환하여 저장함

변수명 = DataFrame명.to_dict('딕셔너리포맷') : 데이터프레임 값들을 설정한 포맷으로 딕셔너리로 변환하여 저장함

*_df['칼럼명'] = 0 : 칼럼 삽입 후 0 값으로 할당

*_df.replace(딕셔너리) : 딕셔너리에 해당되는 값으로 변경(코드화 할 때 유용함)

*_df.rename(columns={'A':'B'}, inplace=True) : 열 이름을 A에서 B로 변경하고 원본객체에 적용

변수=pd.merge(A, B) : 데이터프레임과 A와 B를 합친 데이터프레임을 변수에 저장

*_df.drop( ['칼럼명'] , axis=0/1, index=None, columns=None, level=None, inplace=False, errors=‘raise’) : 데이터 삭제 

*_df.drop( ['칼럼명'] , axis=0/1, inplace=False) : 데이터 삭제 (심플 버전)

변수 = *_df.index : *_df 데이터프레임에 인덱스(순번)을 변수에 저장

print(변수.values) : 변수에 저장된 인덱스(순번)을 출력 (단순하게 print(변수)로 하면 인덱스 기본 정보만 보임)

변수 = *_df['컬럼명'] : *_df 데이터프레임에 특정 컬럼을 시리즈 객체로 저장 

변수_df = *_df.reset_index(inplace=False) : 인덱스가 훼손된 경우, 인덱스을 다시 발번 후 변수_df에 저장(원본 객체는 수정X)

변수_df = *_df.reset_index(inplace=True) : 인덱스가 훼손된 경우, 인덱스을 다시 발번(원본 객체는 수정O). 변수_df 대입연산 없이 단독으로도 사용 가능

변수_df = *_df.reset_index(inplace=False, drop=True) : drop=True인 경우, 기존 인덱스가 2번째 열에 추가되지 않음

변수_df = *_df.reset_index('이름', inplace=True, drop=True) : 이름을 인덱스로 쓰고 원본 객체도 수정.

변수=*_df['열이름', '열이름2' ....] : *_df 데이터프레임에서 특정 열들을 뽑아 변수에 저장

변수=*_df['열이름' == 3] : *_df 데이터프레임에서 특정 열의 값이 3인 셀들을 변수에 저장

변수=*_df[*_df['Age'] > 60] :  *_df 데이터프레임에서 Age가 60세 이상인 행들을 변수에 저장

변수=*_df['Age' > 60][[ 'Name', 'Age']] : *_df 데이터프레임에서 Age가 60세 이상인 Name, Age 열들을 변수에 저장

*_df.iloc[행번호,열번호] : (위치기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

*_df.loc[행이름,열이름] : (이름기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

변수=*_df[df['나이'].isin([21, 23])] : 나이가 21세, 23세인 행들을 변수에 저장

df[df['이름'].str.contains('봄')] : 이름에 '봄'이 들어가는 경우 출력

df[df['이름'].str.contains('^봄')] : 이름이 '봄'으로 시작하는 경우 출력

df[df['이름'].str.contains('봄$')] : 이름이 '봄'으로 끝나는 경우 출력
df[df['이름'].str.contains('^.{1}봄')] : 이름의 두 번째 글자가 '봄'인 경우 출력

df.sort_index(axis=0).head( ) : 인덱스 순번 기준으로 오름차순 정렬
변수=*_df.sort_values(by=['열이름'], ascending=True, inplace=False) : 특정 열이름 기준으로 오름차순 정렬하고 원본객체는 수정하지 않음

asending 옵션 : True(기본값, 오름차순 정렬) / False(내림차순 정렬)

inplace 옵션 : False(기본값, 원본객체 수정X) / True (원본객체 수정O)

*_df.min() : *_df 데이터프레임의 각 열당 최소값 리턴

*_df.max() : *_df 데이터프레임의 각 열당 최대값 리턴

*_df.sum() : *_df 데이터프레임의 각 열당 합계 리턴

*_df.count() : *_df 데이터프레임의 각 열당 셀 개수 리턴

*_df.mean() : *_df 데이터프레임의 각 열당 평균값 리턴

*_df.std() : *_df 데이터프레임의 각 열당 표준편차 리턴

*_df.median() : *_df 데이터프레임의 각 열당 중간값 리턴

*_df.agg({'max', 'min', 'median'...}) : *_df 데이터프레임의 각 열당 max, min 등 여러 값들을 출력

*_df.agg({'A':'max', 'B':'min', 'C':'median'...}) : *_df 데이터프레임의 A열은 max, B열은 min 등 딕셔너리포맷으로 각각 다른 값들을 출력

변수=*_df.groupby(by='컬럼명').통계함수() : *_df 데이터프레임의 특정 컬럼의 값들을 그룹화하여 '행'으로 표현하여 변수에 대입

변수=*_df.groupby(by=['물건'], as_index=False)['가격'].통계함수() : *_df 데이터프레임의 물건 별 가격을  '열'로 표현하여 변수에 대입 (as_index=False는 인덱스 발번한다는 뜻이고, True는 발번 X)

*_df.isna() : *_df 데이터프레임의 NaN 여부 확인 (True인 경우, NaN값 존재)

*_df.isna().sum() : *_df 데이터프레임의 NaN 개수 출력

*_df.isna() : *_df 데이터프레임의 NaN 여부 확인 (True인 경우, NaN값 존재)

*_df ['열이름_a'] = *_df['열이름'].fillna('~~~') : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 맨 마지막 열에 열이름_a를 추가하여 NaN→~~~로 변경한 열 추가

 *_df ['열이름'] = *_df['열이름'].fillna('~~~') : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 해당 열의 NaN→~~~로 값 변경

*_df['열이름'].fillna('~~~', inplace=True) : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 해당 열의 NaN→~~~로 값 변경 ( *_df ['열이름'] = *_df['열이름'].fillna('~~~') 명령어와 동일한 결과 리턴)

변수명= lambda x: 수식

print(변수명(x))

:: 간단한 수식을 람다표현식으로 함수 생성 후, 그 결과를 출력

list(map(lambda x: 수식, [리스트 값])) : 리스트 값에 람다표현식으로 생성한 함수를 모두 적용

*_df['열이름_a']=*_df['열이름'].apply(lambda x: 수식) : *_df 데이터프레임에 특정 열의 값을 람다표현식의 함수를 적용하여 나온 값들을 마지막 열(열이름_a)에 저장

*_df['열이름_a']=*_df['열이름'].apply(lambda x: 'A' if x>5 else 'B') : *_df 데이터프레임에 특정 열의 값을 5보다 크면 A, 작으면 B로 리턴하여 마지막 열(열이름_a)에 저장

 

 

 라이브러리 사용 방법

 import pandas as pd 명령으로 Pandas라이브러리를 pd에다 정의한다. pd는 판다스를 뜻하는 변수명의 관례이다.

② 변수명 = pd.*() 명령으로 특정 변수를 판다스 데이터로 정의한다.

 

반응형

 


준비물) law 데이터 취득하기 in 캐글(Kaggle)

<캐글 바로가기>

 

1) 로그인 

캐글(Kaggle) 캐글(Kaggdle)

 

2) 스크롤을 내려서 다운로드 아이콘 클릭

 

반응형

1) 시리즈 & 데이터프레임 생성

 

변수 = pdSeries[1, 2, 3, 4] : [1, 2, 3, 4] 시리즈를 생성하여 변수에 저장 (대문자 주의!)

변수 = pd.Series([1,2,3], index=['a','b','c']) : [1,2,3] 시리즈를 생성하고, 인덱스를 각각 a,b,c로 지정하는 변수 저장 (대문자 주의!)

변수 = pd.DataFrame(a, column=b) : 리스트 a로 행을 만들고 열 이름은 b로 하는 데이터프레임을 생성

변수 = pd.concat([series1, series2, series3, series4], axis=1) : 여러개의 시리즈를 붙여 데이터프레임 생성 후 변수에 저장
변수.columns = ['이름', '성별', '나이', '키'] : 변수의 열 이름 정의

 *_df.info() : DataFrame을 구성하고 있는 데이터셋의 칼럼의 정보를 간략히 보여줌

 

 

<예시1> - 시리즈 생성

(L4) : [1,2,3,4]를 원소로 갖는 시리즈를 생성하여 a에 저장 (시리즈 a는 인덱스를 지정하지 않았으므로 기본 인덱스로 숫자 0, 1, 2, 3이 지정됨.)

(L6) : [1,2,3]를 원소로 갖는 시리즈를 생성하고 인덱스는 각각 a,b,c로 지정하여 b에 저장

 

 

<예시2> - 데이터프레임 생성

(L6) list1을 행 성분, col_names를 열 이름으로 하는 데이터 프레임 생성

반응형

 

 

<예시3> - 시리즈를 합쳐 데이터프레임 생성

(L3~6) 각각 열 성분의 시리즈를 생성

(L9~10) 열 성분의 시리즈를 이어붙여 데이터프레임을 생성하고, 이를 변수 data에 저장하며, 열이름 지정

(L11) 변수 data의 타입은 데이터프레임인 것을 확인할 수 있음. 시리즈를 concat(이어붙이기)하는 순간 데이터프레임이 된다.

(L12) 데이터 확인

(L13) 이미 정의되어있는 데이터프레임을 다시 데이터프레임 정의하는 명령어를 쓰게되는 경우, 팬시하게 출력하는 기능밖에 없음

 

※ 보통, 시리즈를 묶어서 데이터프레임을 만들기보단 리스트나 딕셔너리를 이용하여 데이터프레임을 정의한다.


 

<예시4> - 딕셔너리로 데이터프레임 생성

 

 

 

<예시5> - 넘파이배열(ndarray)로 데이터프레임 생성

반응형

 


2) .csv 파일 저장/불러오기

 

df.to_csv(' 파일경로/파일명.csv ', header=True, index=False, encoding='utf-8') : 데이터프레임 .csv파일로 저장. 헤더(열이름)도 같이 저장하고, 인덱스(순번)은 따로 저장하지 않음. 인코딩 양식은 한글이 있으므로 utf-8로 저장함.

변수 = pd.read_csv('파일경로/파일명.csv', sep=',') : 파일 불러오기. 변수에 엑셀자료를 DataFrame형태로 저장, 이때 데이터프레임을 구분짓는 구분자는 ','로 한다. (csv 파일은 기본 구분자가 쉼표(,)이다. 쉼표를 구분자로 설정하지 않으면 에러남)

from google.colab import drive : 구글 드라이브 사용을 위한 라이브러리 Import 
drive.mount('/content/drive') : 구글 드라이브를 마운트 시킴

from google.colab import files : 파일 다운을 위한 라이브러리 Import
files.download('/content/drive/My Drive/file.csv') : 구글 드라이브에 파일을 PC로 다운로드

 

 

★주의★

 

구글 Colab을 개발환경으로 사용하는 경우 : 로컬 PC의 경로를 인식 못함. 구글 Drive에 저장하고 불러들여야 함.

Jupyter를 개발환경으로 사용하는 경우 : 로컬 PC의 경로를 인식함.

 

★주의★

경로를 입력할때는 백슬래시(\)가 아닌 슬래시(/)로 입력해주어야 한다.

그렇지 않으면 아래와 같은 SyntaxError가 난다.

    titanic_df = pd.read_csv('C:\Users\PC\Downloads\titanic\train.csv')
                                                                      ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

 

 

 

★참고★

utf-8로 인코딩을 하게 되면, 소스코드 상에서 .csv 파일을 불러오고, 메모장으로 볼 때는 문제없지만, 엑셀을 켜서 보면 깨져서 나온다. 이런 경우, 메모장으로 저장한 .csv 파일을 실행시켜서 Ctrl+Shift+S로 다른이름으로 저장을 누른 후 ANSI로 인코딩 타입을 바꾸면 엑셀에서 잘 보인다.

당연히 나중에 파이썬에서 불러올때는인코딩을 utf-8로 바꿔줘야 한다.

(ANSI 인코딩 타입은 파이썬에서 가져오지 못함)

 

utf-8은 엑셀을 켜서 보면 깨져나옴

 

 

 

 

<예시1> - 구글 Colab에서 로컬 PC 경로에 저장/불러오기 (에러 발생)

(L4) 리스트 정의

(L12) 열이름 정의

(L13) 정의한 리스트와 열이름으로 데이터프레임 생성

(L18) 구글 Colab에서는 로컬PC의 경로를 인식하지 못하여 에러 발생

반응형

 

 

<예시2> - Jupyter Notebook에서 데이터프레임 저장/불러오기

예시1과 완전히 동일한 소스코드지만, 해당 경로에 정상적으로 .csv 파일이 저장되고 잘 불러옴

 

<예시3> - 구글 Colab 내 드라이브 안에 파일 저장/불러오기

(L3) 구글 드라이브를 Import

(L4) 구글 드라이브 경로를 마운트시킴

(L20) 구글 드라이브-내 드라이브에 file.csv 파일 저장. (옵션 설명은 생략)

(L22) 구글 드라이브-내 드라이브에 file.csv 파일 불러오기

반응형

 

<예시4> - 구글 Colab에 저장된 파일 로컬 PC에 다운로드

(L1) 파일 다운을 위한 라이브러리 Import
(L2) 구글 드라이브에 파일을 PC로 다운로드. (다운로드 경로는 C:\Users\PC\Downloads로 경로 지정은 불가능함)

 

 

 

 

<예시5>

엑셀을 읽어야 하므로 변수는 DataFrame (칼럼이 여러 개인 데이터 구조체) 형태로 읽어와야 한다.

DataFrame의 경우, 변수뒤에 _df를 붙이는 것이 관례이다.

 

반응형

 


3) 데이터프레임 속성 확인

 

*_df : 데이터프레임 출력

 *_df.head(3) : 데이터프레임의 앞 3줄만 출력(팬시하게 출력)

 *_df.tail(3) : 데이터프레임의 끝 3줄만 출력(팬시하게 출력)

type(*_df) : 데이터프레임의 타입 확인

*_df.columns : 데이터프레임의 열 정보 확인

*_df.shape : 데이터프레임의 n행 m열 출력

*_df.info() : 데이터프레임의 행렬 상세 정보 출력

*_df.describe() : 데이터프레임의 각 열별 통계정보 출력

 

 

<예시1> - 각종 정보 출력(1) - 데이터 타입이 문자열인 경우

(코드6-18) 데이터프레임 df의 열정보 출력

(코드6-19) 데이터프레임 df의 각 열별 통계정보 출력 ; count=요소 개수, unique=중복제거했을때 요소 개수, top=빈도수가 제일 많은것(빈도수가 1이면 제일 앞에있는거 출력해줌), freq=빈도수가 제일 많은 것의 빈도수(중복수)

(코드6-20) 데이터프레임 df의 앞 3줄만 출력

(코드6-21) 데이터프레임 df의  3줄만 출력

반응형

 

<예시2> - 각종 정보 출력(2) 데이터 타입이 숫자인 경우

titanic_df = pd.read_csv('d:/Example/train.csv')
print("type:",type(titanic_df),"\n=====================")
print("shape:",titanic_df.shape,"\n=====================")
print("info:",titanic_df.info(),"\n=====================")
print("describe:\n",titanic_df.describe(),"\n=====================")
titanic_df

 

<출력결과>

type(*_df) : class 'pandas.core.frame.DataFrame이라고 출력된다.

*_df.shape : 891x12 행렬을 지닌 데이터프레임이다.

*_df.info() : 데이터프레임의 각 행별 정보(자료형 등)를 시현해준다.

*_df.describe() : 데이터프레임의 각 행별 통계정보를 보여준다.

*_df : 데이터프레임에 어떤 데이터가 저장되어있는지 보여준다.

반응형
 
 
 

4) 다른 타입으로 데이터 변환

 

*.value_counts() : Series/DataFrame의 값의 유형과 갯수를 집계해줌

변수 = pd.DataFrame(list명, colums=칼럼명) :: 특정 칼럼명으로 특정 list들을 다중칼럼 자료형인 DataFrame으로 변환변수 = pd.DataFrame(ndarray명, colums=칼럼명) :: 특정 칼럼명으로 특정 ndarray들을 다중칼럼 자료형인 DataFrame으로 변환

변수 = pd.DataFrame(dict) : 딕셔너리 dict로 DataFrame 변환

변수명 = DataFrame명.values : 데이터프레임 값들을 넘파이 ndarray로 변환하여 저장함

변수명 = DataFrame명.values.tolist() : 데이터프레임 값들을 리스트로 변환하여 저장함

변수명 = DataFrame명.to_dict('딕셔너리포맷') : 데이터프레임 값들을 설정한 포맷으로 딕셔너리로 변환하여 저장함

 

 

① DataFrame → Series 변환하기

 
DataFrame[‘칼럼 이름’]
:: DataFrame의 특정 칼럼을 Series로 반환. 즉, 다중칼럼 → 단일칼럼으로의 변환
 
 
<예시>
- titanic_df 중 Pclass에 해당하는 칼럼을 pclass 변수에 저장
(첫번째 열은 인덱스, 두번째 열은 값 형태로 Series는 구성되어 있다.)

 

※ 참고

*.value_counts() : Series/DataFrame의 값의 유형과 갯수를 집계해줌
(단, 리스트/ndarray(넘파이행렬)에선 사용 불가. n차원에서도 못씀)
 
 
<예시>
Series인 pclass에는 3, 1, 2 순으로 값이 많고, 각각 491, 216, 184개가 들어있다. 가져온 데이터프레임의 칼럼 이름은 'Pclass'이며, 자료형은 int64로 이루어져 있다.
 
반응형

 

 

② 1차원 리스트 DataFrame 변환하기

변수 = pd.DataFrame(list명, colums=칼럼명)
:: 특정 칼럼명으로 특정 list들을 다중칼럼 자료형인 DataFrame으로 변환
 
 
<예시>
3개의 요소를 가진 리스트 list1을 'col1'이라는 이름으로 데이터프레임을 생성
 
 
 
 
 

③ 1차원 ndarray(넘파이행렬) DataFrame 변환하기

 
변수 = pd.DataFrame(ndarray명, colums=칼럼명)
:: 특정 칼럼명으로 특정 ndarray들을 다중칼럼 자료형인 DataFrame으로 변환
 
 
<예시>
3개의 요소를 가진 ndarray arr1을 'col1'이라는 이름으로 데이터프레임을 생성
 
반응형

 

 

④ n차원 리스트 DataFrame 변환하기

 
n차원 리스트도 1차원 리스트와 방법은 동일하다.
n차원 리스트 또한 여러 리스트의 집합일 뿐, 행렬이 아니므로 *.shape()함수는 사용할 수 없다.
(당연히 value_counts()도 사용할 수 없다.)
 
 
<예시>
3차원 리스트를 DataFrame으로 변환
 
 
 
 

⑤ n차원 ndarray  DataFrame 변환하기

 
n차원 ndarray도 1차원 ndarray 와 방법은 동일하다.
n차원 ndarray 의 경우, 앞서 말했다시피 *.shape()함수는 사용할 수 있지만 value_counts()는 사용할 수 없다.
 

<예시>

 
 
 
반응형

 

 

⑥ 딕셔너리  DataFrame 변환하기

 
딕셔너리 정의 : dict = {'이름1' : 데이터1, '이름2' : 데이터 2 .....}
변수 = pd.DataFrame(dict) : 딕셔너리 dict로 DataFrame 변환
 
 
 - 키(Key) 칼럼 이름
 - 값(Value) 칼럼 데이터
 
 
 
※ 참고 : 딕셔너리란?
 
사람은 누구든지 "이름" = "홍길동", "생일" = "몇 월 며칠" 등과 같은 방식으로 그 사람이 가진 정보를 나타낼 수 있다. 파이썬은 영리하게도 이러한 대응 관계를 나타낼 수 있는 딕셔너리(dictionary) 자료형을 가지고 있다. 이번에는 이 자료형에 대해 알아보자.
 

딕셔너리는 단어 그대로 ‘사전’이라는 뜻이다. 즉 "people"이라는 단어에 "사람", "baseball"이라는 단어에 "야구"라는 뜻이 부합되듯이 딕셔너리는 Key와 Value를 한 쌍으로 가지는 자료형이다. 예컨대 Key가 "baseball"이라면 Value는 "야구"가 될 것이다.

딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.

 

 
 <예시>
총 3개의 키:값 쌍으로 이루어진 딕셔너리(dict)를 df_dict에 DataFrame으로 변환
 
반응형

 

⑦ DataFrame  ndarray 변환하기

변수명 = DataFrame명.values : 데이터프레임 값들을 넘파이 ndarray로 변환하여 저장함
 

<예시>

array3에 df_dict 데이터프레임 값들을 *.values를 이용하여 값들을 저장한다. *.values 함수를 이용하면 저장된 array3 변수는 자동으로 넘파이 ndarray로 자료형이 저장된다.

 

 

⑧ DataFrame 리스트 변환하기

변수명 = DataFrame명.values.tolist() : 데이터프레임 값들을 리스트로 변환하여 저장함
 
 
<예시>
⑦의 설명과 동일하지만, 리스트로 변환하려면 *values.tolist() 함수를 사용해야 명시적으로 리스트 형변환이 된다.
 
 
 

⑨ DataFrame 딕셔너리 변환하기

 
변수명 = DataFrame명.to_dict('딕셔너리포맷') : 데이터프레임 값들을 설정한 포맷으로 딕셔너리로 변환하여 저장함
 

※ 딕셔너리 포맷의 종류

  1. 'list' (기본값): 열 이름을 키로 사용하고 열 데이터를 리스트로 변환 (키-값 쌍으로 저장됨)
  2. 'dict': 열 이름을 키로 사용하고 열 데이터를 딕셔너리로 변환 (이중 키-값 쌍으로 저장됨)
  3. 'series': 열 이름을 키로 사용하고 열 데이터를 Series 객체로 변환 (이중 키-값(시리즈) 쌍으로 저장됨)
  4. 'split': 열 이름을 기준으로 열 데이터를 딕셔너리로 변환하며, 인덱스를 따로 지정 가능 (인덱스/키/값이 각각 저장됨)

 

<예시>

 

반응형

 


5) 컬럼 삽입/변경

 

*_df['칼럼명'] = 0 : 칼럼 삽입 후 0 값으로 할당

*_df.replace(딕셔너리) : 딕셔너리에 해당되는 값으로 변경(코드화 할 때 유용함)

*_df.rename(columns={'A':'B'}, inplace=True) : 열 이름을 A에서 B로 변경하고 원본객체에 적용

변수=pd.merge(A, B) : 데이터프레임과 A와 B를 합친 데이터프레임을 변수에 저장

 

 

<예시1>

titanic_df 마지막 열에 새로운 컬럼 Age_0이 추가고, 0값을 할당한다.

 

<예시2>

Age_by_10 컬럼을 맨 마지막 열에 추가하고 Age 컬럼x10 값을 대입한다.

Family_No 컬럼을 맨 마지막 열에 추가하고 SibSp 컬럼+ Parch 컬럼 +1 값을 대입한다.

반응형

 

<예시3>

기존에 정의되어있는 Age_by_10 컬럼에 숫자 100 추가

 

 

<예시4> - 컬럼 추가

보너스 열을 추가하여 나이 X 10000으로 값을 넣어줌

 

<예시5> - 남자를 1로, 여자를 0으로 코드화하기

(L2) 코드화하기 위해서는 이중 딕셔너리로 정의해야 한다. '성별'에 해당하는 딕셔너리에서, 남자는 1, 여자는 0으로 이중 딕셔너리 정의

(L3) 정의된 rep_cond 이중딕셔너리에 대응되는 행/열 값 변경

반응형

 

<예시6> - 컬럼 이름 바꾸기

열 이름을 키에서 키 평균으로 변경 (이번만 변경한 것이지, 원본객체는 적용되지 않는다.)

 

<예제7> - 컬럼 이름 바꾸고 컬럼 합치기 (원본객체 미적용)

(L1~2) mean_by_gender 데이터프레임의 컬럼 이름을 '키'에서 '키 평균'으로 변경 (원본객체 미적용)

(L4~5) std_by_gender 데이터프레임의 컬럼 이름을 '키'에서 '키 표준편차'으로 변경 (원본객체 미적용)

(L7~8) 데이터프레임 mean_by_gender과 std_by_gender의 컬럼을 합치기. 하지만, L1~5에서 컬럼 이름 변경작업이 원본객체 변경을 일으키지 않았으므로, 컬럼 이름이 '키'로 둘다 같아짐에 따라 혼선이 생겨 값이 출력되지 않았다.

 

 

<예제8> - 컬럼 이름 바꾸고 컬럼 합치기 (원본객체 적용)

(L1~2) mean_by_gender 데이터프레임의 컬럼 이름을 '키'에서 '키 평균'으로 변경 (원본객체 적용)

(L4~5) std_by_gender 데이터프레임의 컬럼 이름을 '키'에서 '키 표준편차'으로 변경 (원본객체 적용)

(L7~8) 데이터프레임 mean_by_gender과 std_by_gender의 컬럼을 합치기. L1~5에서 컬럼 이름 변경작업이 원본객체에도 적용됨에 따라, 정상 출력 됨.

반응형

 


6) 컬럼 삭제

 

*_df.drop( ['칼럼명'] , axis=0/1, index=None, columns=None, level=None, inplace=False, errors=‘raise’) : 데이터 삭제 
*_df.drop( ['칼럼명'] , axis=0/1, inplace=False) : 데이터 삭제 (심플 버전)

 

컬럼 삭제 함수인 *,drop은 다양한 옵션을 가지고 있다. 그 중 주요하게 들어가야 할 옵션은 label(삭제하고자 하는 행렬), axis(행/열 지정), inplace(원본삭제여부)이다.

 

여기서 label은 axis=0(행방향 삭제)인 경우 인덱스 이름을 넣어야 하고, axis=1(열방향 삭제)인 경우, 칼럼 이름을 넣어야 한다. 

inplace=False 이면 원본 손실 없이 원본을 복제하여 칼럼 삭제한다. inplace=True 인 경우에는 원본 칼럼이 삭제된다. inplace 옵션이 생략된 경우, False가 기본값이다.

반응형
반응형

 

<예시1>

원본 데이터 프레임(titanic_df)에서 'Age_0' 열을 삭제하고 그 결과를 drop_df에 저장한다. (inplace 옵션이 생략되었으므로 원본 데이터 프레임에서는 삭제하지 않는다.)

원본 데이터프레임에 'Age_0' 열이 삭제되지 않았다.

 

<예시2>

원본 데이터 프레임(titanic_df)에서 ['Age_0', 'Age_by_10', 'Family_No'] 열을 모두 삭제한다.

inplace가 True으로 원본 데이터 프레임의 열 삭제가 목적이므로 drop_df에 별도 저장없이 None이 반환된다.

원본 데이터프레임에 3개 열이 삭제되었다.

<예시3>

원본 데이터 프레임(titanic_df)에서 0~2 행을 모두 삭제한다.

inplace가 True인 경우, 예시2처럼 변수에 대입하는 방법 외에 *.drop 명령어만 단독으로 실행해도 된다.

(inplace=False인 경우는 반드시 변수 대입해주는 포맷으로 써야함)

 

★주의★

0~2행을 지우고 싶어서 [:2]라고 하면 구문오류가 난다.

[0,1,2]는 괜찮지만, [:2]를 사용하는 대신 range(2)라고 사용해야 구문오류가 안난다.

원본 데이터프레임의 0~2행이 모두 삭제되었다.

 

 

<예시4> - 보너스 열 삭제(원본객체 적용)

반응형

 


7) 인덱스 객체 / 시리즈 객체 / 인덱스 리셋

 

변수 = *_df.index : *_df 데이터프레임에 인덱스(순번)을 변수에 저장

print(변수.values) : 변수에 저장된 인덱스(순번)을 출력 (단순하게 print(변수)로 하면 인덱스 기본 정보만 보임)

변수 = *_df['컬럼명'] : *_df 데이터프레임에 특정 컬럼을 시리즈 객체로 저장 

변수_df = *_df.reset_index(inplace=False) : 인덱스가 훼손된 경우, 인덱스을 다시 발번 후 변수_df에 저장(원본 객체는 수정X)

변수_df = *_df.reset_index(inplace=True) : 인덱스가 훼손된 경우, 인덱스을 다시 발번(원본 객체는 수정O). 변수_df 대입연산 없이 단독으로도 사용 가능

변수_df = *_df.reset_index(inplace=False, drop=True) : drop=True인 경우, 기존 인덱스가 2번째 열에 추가되지 않음

변수_df = *_df.reset_index('이름', inplace=True, drop=True) : 이름을 인덱스로 쓰고 원본 객체도 수정.

 

① 인덱스 객체 (*_df.index) 

 

변수 = *_df.index : *_df 데이터프레임에 인덱스(순번)을 변수에 저장

print(변수.values) : 변수에 저장된 인덱스(순번)을 출력 (단순하게 print(변수)로 하면 인덱스 기본 정보만 보임)

 

<예시1>

(L4) index에 titanic_df의 인덱스를 저장

(L5) print(index)를 통해 index 변수에 저장된 인덱스 정보를 출력

(L6) print(index.values)를 통해 실제 저장된 인덱스 값들을 출력

반응형

 

 <예시2>

(L2) index 변수의 타입은 판다스 라이브러리를 사용하여 정의한 RangeIndex라는 녀석이다.

(L3) index.values의 타입은 넘파이 ndarray이다. 실제 저장된 인덱스 값이 저장된 배열이다.

(L4) index.values의 shape은 891개의 값을 가진 1차원 ndarray 배열이다.

(L5~L7) 0~4번째 값을 출력하기 위해서 [:5]는 index뒤에 붙여도 되고, values 뒤에 붙여도 된다. 하지만 값 출력을 위해서는 반드시 .values를 붙여야 한다. .values를 붙이지 않으면 인덱스의 정보만 출력해주게 된다(L5).

(L8~9) 유일하게 단일 값출력을 하는 경우에 한해서, .values를 붙이는 여부와 상관없이 index[7]을 출력해도 출력이 가능하다.

 

<예시3>

인덱스는 고유한 값이므로 임의로 수정(대입연산)이 불가능하다.

반응형

 

② 시리즈 객체

 

변수 = *_df['컬럼명'] : *_df 데이터프레임에 특정 컬럼을 시리즈 객체로 저장 

 

 

<예시1>

데이터프레임의 Fare 컬럼을 series_fair 변수에 저장

 

<예시2>

series_fair 변수가 시리즈 객체이므로 다양한 수학연산 함수를 사용할 수 있다.

(L1) *.max() 함수는 시리즈에서 최대값을 구해줌

(L2) *.sum() 함수는 시리즈의 모든 값의 합을 구해줌 (소수점 네 자리까지)

(L3) sum(*) 함수는 시리즈의 모든 값의 합을 구해줌 (소수점 열 두 자리까지)

(L4) 시리즈 모든 값에서 3을 더하고 첫 3행 까지만 출력

반응형

 

반응형

 

③ 인데스 리셋

 

변수_df = *_df.reset_index(inplace=False) : 인덱스가 훼손된 경우, 인덱스을 다시 발번 후 변수_df에 저장(원본 객체는 수정X)

변수_df = *_df.reset_index(inplace=True) : 인덱스가 훼손된 경우, 인덱스을 다시 발번(원본 객체는 수정O). 변수_df 대입연산 없이 단독으로도 사용 가능

변수_df = *_df.reset_index(inplace=False, drop=True) : drop=True인 경우, 기존 인덱스가 2번째 열에 추가되지 않음

변수_df = *_df.reset_index('이름', inplace=True, drop=True) : 이름을 인덱스로 쓰고 원본 객체도 수정.

 

<예시1>

(L3) .csv 파일 로드하여 titanic_df 변수에 저장

(L4) titanic_df 변수에 저장되어있는 0~2행 삭제

(L5) 행 삭제로 인하여 꼬여버린 인덱스를 재생성함 (과거의 인덱스는 1열에 index라는 이름의 칼럼으로 추가됨)

(L6) 당연히 타입은 데이터프레임임

 

<예시2>

(L1) value_counts 변수에 원본(titanic_df)의 Pclass열을 집계하여 저장함

(L2) 3 > 1 > 2 순으로 많은 개수순으로 정렬된 것이 출력됨

(L3) 1차원의 데이터프레임이므로 자료형은 시리즈임

(L4) 인덱스 리셋 :: 3 > 1 > 2 순으로 저장되어있는 첫번째 열(Pclass에 저장되어있는 값이지만, 파이썬은 이를 인덱스로 인식했다) 대신, 새로운 인덱스 부여

(L6) 이제 차수(Degree)가 2가 되었으므로 자료형은 데이터프레임임

반응형

 

<예시3>

drop 옵션에 의해 기존의 인덱스가 2번째 열에 추가되지 않음

 

<예시4>

drop 옵션에 의해 기존의 인덱스가 2번째 열에 추가되지 않음

반응형

 

<예시5>

기존의 번호 인덱스를 없애고 이름으로 인덱스를 정의

 

<예시6>

이름으로 썼던 인덱스 말고 인덱스 순번 다시 발번

 

반응형

7) 데이터프레임의 특정 열&셀 추출하기

 

변수=*_df['열이름', '열이름2' ....] : *_df 데이터프레임에서 특정 열들을 뽑아 변수에 저장

변수=*_df['열이름' == 3] : *_df 데이터프레임에서 특정 열의 값이 3인 셀들을 변수에 저장

변수=*_df[*_df['Age'] > 60] :  *_df 데이터프레임에서 Age가 60세 이상인 행들을 변수에 저장

변수=*_df['Age' > 60][[ 'Name', 'Age']] : *_df 데이터프레임에서 Age가 60세 이상인 Name, Age 열들을 변수에 저장

*_df.iloc[행번호,열번호] : (위치기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

*_df.loc[행이름,열이름] : (이름기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

변수=*_df[df['나이'].isin([21, 23])] : 나이가 21세, 23세인 행들을 변수에 저장

df[df['이름'].str.contains('봄')] : 이름에 '봄'이 들어가는 경우 출력

df[df['이름'].str.contains('^봄')] : 이름이 '봄'으로 시작하는 경우 출력

df[df['이름'].str.contains('봄$')] : 이름이 '봄'으로 끝나는 경우 출력
df[df['이름'].str.contains('^.{1}봄')] : 이름의 두 번째 글자가 '봄'인 경우 출력

 

 

★ 주의 ★

※ 단일 대괄호 [ ]와 이중 대괄호 [[ ]]의 차이

 

단일 대괄호 []를 사용하면 Series를 반환하고, 이중 대괄호 [[]]를 사용하면 데이터프레임을 반환합니다.

df[['이름', '키']]는 데이터프레임에서 '이름'과 '키' 열을 선택하여 데이터프레임으로 반환합니다. 결과는 데이터프레임입니다.

df['이름', '키']는 데이터프레임에서 '이름'과 '키' 열을 선택하는 것이 아니라, '이름' 열과 '키'라는 레이블로 된 하나의 열을 선택하려는 시도입니다. 이렇게 작성하면 오류가 발생할 것이며, 예를 들어 '이름' 열과 '키'라는 레이블이 없는 경우 KeyError가 발생할 것입니다.

따라서, df[['이름', '키']]를 사용하여 '이름'과 '키' 열을 선택하여 데이터프레임으로 반환해야 합니다.

 

① 특정 행/열 값 추출하기

변수=*_df['열이름', '열이름2' ....] : *_df 데이터프레임에서 특정 열들을 뽑아 변수에 저장

변수=*_df['열이름' == 3] : *_df 데이터프레임에서 특정 열의 값이 3인 셀들을 변수에 저장

변수=*_df[*_df['Age'] > 60] :  *_df 데이터프레임에서 Age가 60세 이상인 행들을 변수에 저장

변수=*_df['Age' > 60][[ 'Name', 'Age']] : *_df 데이터프레임에서 Age가 60세 이상인 Name, Age 열들을 변수에 저장

 

 

반응형

 

<예시1> - 이름, 키만 뽑아서 데이터프레임으로 출력

 

<예시2> - 키가 180 넘는 사람들만 출력 (타입 변환)

키 열만 시리즈[ ]  형태로 추출하고, 이 타입이 str이므로 int 형태로 변경한 뒤, 180이 넘는 경우 각 행을 데이터프레임[[ ]] 형태로 출력

 

참고로, 기존에 정의한 리스트 및 데이터프레임에는 키와 나이가 문자열(' ')로 정의되어 있었다.

 

 

<예시3> - 키가 180 넘는 사람들만 출력 (문자열이 아닌 숫자로 재정의 후)

(L2~11) 예시2와 다르게 나이와 키 부분을 문자열(' ')이 아닌 숫자형태로 지정하여 리스트 재정의 후 데이터프레임을 생성하였다.

(L13) 키 180 이상만 데이터 프레임 [[ ]] 형태로 출력하니 오류없이 잘 된다.

반응형

 

 

<예시4>

(L1) Pclass열만 뽑아서 시리즈로 3줄만 출력

(L2~3) AA1 변수에 Pclass 열 값을 저장. 이때 1차원 열이므로 타입은 시리즈이다.

(L4) Pclass열과 Survived 열 값만 뽑아서 데이터프레임으로 3줄만 출력

(L5~6) AA2 변수에 Pclass와 Survived 열 값을 저장. 이는 2차원 열이므로 타입은 데이터프레임이다.

 

※참고

head함수를 쓸때마다 print를 걸어준 이유는, 내가 쓰고있는 IDE인 주피터 노트북 특성상, print로 묶어주지 않으면 마지막 문장(L6)만 출력된다.

L1, L4는 다른 IDE에서는 print없이도 출력된다.

 

<예시5>

titanic_df 데이터프레임에서 Pclass 열의 값이 3인 행들을 출력

반응형

 

<예시6>

titanic_df 데이터프레임에서 Age가 60세 이상인 행들을 titanic_boolean에 저장. 조건문에 부합하는 경우 True를, 부합하지 않는 경우 False를 리턴하며 True인 것들만 게더링한다는 의미에서 불린 인덱싱이라고 부른다.

 

<예시7>

titanic_df 데이터프레임에서 Age가 60세 이상인 행들을 Name과 Age 열만 출력한다.

 

<예시8>

&(AND)나 |(OR) 혹은 ~(NOT) 연산자를 이용하여 조건에 맞는 행을 출력하는 불린인덱싱이 가능하다. 표현방법은 In [70]과 같이 해도 되고 In [71]과 같이 해도 동일하게 출력이 가능하다.

반응형

 

<예시9> - 성별이 여자이면서 키가 160 이상인 행들만 출력

 

<예시10> - 나이가 28 이상이거나 성별이 남자인 행들만 출력

 

반응형

 

 

② 위치/이름기반으로 특정 행/열 값 추출하기

 

*_df.iloc[행번호,열번호] : (위치기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

*_df.loc[행이름,열이름] : (이름기반 인덱싱) *_df 데이터프레임에서 특정 행/열의 값을 출력

 

 

 

<예시1> - 1~4행, 0~3열 값들을 출력 (위치기반 인덱싱)

 

 

 

<예시2> 

0행을 출력하고 싶어서 해봤으나, 오류난다. (단일 행출력은 어떻게 하는거지?)

이때 필요한 것이 iloc 또는 loc 함수이다.(설명은 후술하겠다.)

0행출력을 시도하였으나 오류가 났다. 어떻게 출력해야 하지?
이렇게 하면 된다. 설명은 후술한다.

<예시3>

0~1행을 출력하고 싶어서 했는데, 이건 된다! (단일 행 출력은 안되지만, 슬라이싱 행 출력은 되나보다. 왜인지는 모른다.)

 

<예시4>

data_df를 만들어서, data_df.iloc[0,0] 즉 0행 0열의 값을 추출했다.

반응형

 

<예시5>

*.iloc함수는 오직 행/열 번호만으로 값 추출이 가능한 함수이다. 0행의 Name 열 전체 또는 One행 0열 전체를 출력하려고 아래와 같이 했으나, 오류가 난다. 이런 경우, 이름기반 인덱싱 함수인 loc 함수를 써야 한다.

위치기반 iloc를 이용하여 이름으로 출력하려고 했기에 실패했다.

 

<예시6>

팬시 인덱싱과 슬라이싱 인덱싱도 가능하다. 

data_df 정의
팬시 인덱싱
슬라이싱 인덱싱

 

 

<예시7>

행과 열의 이름을 기반으로 추출하고 싶다면, 이름기반 인덱싱함수인 loc함수를 써야 한다.

loc 함수를 이용하여 인덱싱 추출

반응형

 

<예시8>

행의 경우, 대부분 숫자로 구현되어있다. In [56] 에서는 인덱스를 숫자로 부여하였다. 행번호가 숫자인 경우, In [57]과 같이 행에 숫자를 입력하면 된다. (In [58]에 행번호가 1부터 시작하지만, 0을 입력하니 에러가 난 것을 볼 수 있다.)

 

<예시9>

iloc 함수와 마찬가지로 당연히 loc 함수도 팬시 인덱싱이 가능하다. 아래와 같이 특정 행/열을 여러개 선택할 수 있다.

반응형

 

<예시10>

당연히 슬라이싱 인덱싱도 가능하다.

다만 주의할 점은 행/열이름이 숫자가 아닌 경우, 시작 ~ 끝-1을 할 수 없으므로 시작 ~ 끝이 범위라는 점이다.

행과 열 모두 문자열이므로 끝 -1을 할 수 없어 Three, Year까지 출력된다.

 

<예시11>

'① 특정 행/열 값 추출하기'의 <예시4>와 동일한 결과를 추출하는데, loc함수를 이용해도 가능하다. (많이 쓰이진 않음)

 

<예시12> - 4번 행의 키를 5cm 더하고 원상복구하기

(L2) 4번 행의 '키'열에 해당하는 값을 5더하라

(L3) 4번 행의 데이터프레임 출력

(아래 소스) 5 더한 부분을 원상복구 수행

반응형

 

<예시14> - 1~3행의 키값을 "모름"으로 변경

(L2) 1~3행의 키 값을 "모름"으로 변경, 여기서 ['모름'] * 3은 곧, ['모름', '모름', '모름']을 의미한다.

(아래 소스코드) 수정한 부분을 원복

 

 

③ 특정 숫자/글자가 들어가는 경우 출력

 

변수=*_df[df['나이'].isin([21, 23])] : 나이가 21세, 23세인 행들을 변수에 저장

df[df['이름'].str.contains('봄')] : 이름에 '봄'이 들어가는 경우 출력

df[df['이름'].str.contains('^봄')] : 이름이 '봄'으로 시작하는 경우 출력

df[df['이름'].str.contains('봄$')] : 이름이 '봄'으로 끝나는 경우 출력
df[df['이름'].str.contains('^.{1}봄')] : 이름의 두 번째 글자가 '봄'인 경우 출력

 

 

<예시1> - 나이가 21세, 23세인 행들만 출력

 

<예시2> - contrains 함수를 이용하여 특정 문자열 출력

(코드 6-30) 현재 df 데이터프레임의 현황 출력

(코드 6-31) 이름에 어디든 '현'이 들어가면 출력

(코드 6-32) 이름이 '오'로 시작하면 출력

(코드 6-33) 이름이 '현'으로 끝나면 출력

(코드 6-34) 이름 두 번째 글자(가운데 글자)가 '규'이면 출력

반응형

 


8) 데이터프레임 정렬하기

df.sort_index(axis=0).head( ) : 인덱스 순번 기준으로 오름차순 정렬
변수=*_df.sort_values(by=['열이름'], ascending=True, inplace=False) : 특정 열이름 기준으로 오름차순 정렬하고 원본객체는 수정하지 않음

asending 옵션 : True(기본값, 오름차순 정렬) / False(내림차순 정렬)

inplace 옵션 : False(기본값, 원본객체 수정X) / True (원본객체 수정O)

 

<예제1> - 인덱스 순번 기준으로 오름차순 값 정렬

 

<예제3> - 특정 열을 기준으로 값 정렬

Name을 기준으로 오름차순 정렬한다. ascending과 inplace는 생략하였으므로 기본값으로 설정되어있다.

 

<예제4> - 2개 열을 기준으로 값 정렬

나이를 기준으로 내림차순 정렬하고, 동등인 경우, 키를 기준으로 내림차순 추가 정렬한다.

 

 

<예제5> - 2개 열을 기준으로 값 정렬

먼저 'Pclass' 열을 기준으로 정렬하고 그 다음에 'Name' 열을 기준으로 정렬한다. 먼저 'Pclass' 열에 대한 정렬이 이루어지며, 'Pclass' 값이 동일한 경우 'Name' 열을 기준으로 추가 정렬한다.

반응형

9) 데이터프레임의 통계함수(Aggregation 함수)

 

*_df.min() : *_df 데이터프레임의 각 열당 최소값 리턴

*_df.max() : *_df 데이터프레임의 각 열당 최대값 리턴

*_df.sum() : *_df 데이터프레임의 각 열당 합계 리턴

*_df.count() : *_df 데이터프레임의 각 열당 셀 개수 리턴

*_df.mean() : *_df 데이터프레임의 각 열당 평균값 리턴

*_df.std() : *_df 데이터프레임의 각 열당 표준편차 리턴

*_df.median() : *_df 데이터프레임의 각 열당 중간값 리턴

*_df.agg({'max', 'min', 'median'...}) : *_df 데이터프레임의 각 열당 max, min 등 여러 값들을 출력

*_df.agg({'A':'max', 'B':'min', 'C':'median'...}) : *_df 데이터프레임의 A열은 max, B열은 min 등 딕셔너리포맷으로 각각 다른 값들을 출력

 

 

<예시1>

titanic_df 데이터프레임의 각 열당 셀 개수 구하기

 

<예시2>

titanic_df 데이터프레임의 Age와 Fare의 평균값 구하기

반응형

 

<예시3>

titanic_df 데이터프레임의 모든 열의 max와 min값 구하기

에러가 뜬 이유는 'Cabin'과 'Embarked' 열은 max와 min값을 도출할 수 없어서 에러가 리턴됨. max/min을 구할 수 없는 열은 생략된 채로 출력된다.

 

<예시4>

titanic_df 데이터프레임의 Age, Fare 열의 max와 min값 구하기

 

<예시5>

titanic_df 데이터프레임의 Age는 max값을, Fare은 min값 구하기

.

 

 

반응형

10) 데이터프레임의 그룹함수(groupby 함수)

 

변수=*_df.groupby(by='컬럼명').통계함수() : *_df 데이터프레임의 특정 컬럼의 값들을 그룹화하여 '행'으로 표현하여 변수에 대입

변수=*_df.groupby(by=['물건'], as_index=False)['가격'].통계함수() : *_df 데이터프레임의 물건 별 가격을  '열'로 표현하여 변수에 대입 (as_index=False는 인덱스 발번한다는 뜻이고, True는 발번 X)

 

★ 주의 ★

groupby 함수는 끝에 통계함수를 쓰지 않으면 자료형을 리턴한다.

 

예)

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001CF92D72D10>

 

원하는 값을 보려면 반드시 뒤에 통계함수()를 써줘야 한다. 값을 보기 위한 것이라면 max나 min 함수를 쓰는 것을 추천한다.

 

 

 

<예시1>

In [79] : 데이터프레임의 Pclass열을 groupby 함수로 만든 변수는 DataFrameGroupBy라는 자료형으로 정의된다.

In [81] : Groupby 함수를 통해 Pclass열을 그룹화하여 행으로 표현한 후 나머지 열들의 셀 개수를 카운트한다.

 

<예시2>

Pclass 열을 그룹화하여 행으로 표현하고, PassengerId와 Survived 열의 개수만 출력

반응형
반응형

 

<예시3>

Pclass, Sex 열을 그룹화하여 행으로 표현하고, 나머지 모든 열의 개수만 출력

 

<예시4>

Pclass, Sex 열을 그룹화하여 행으로 표현하고, PassengerId와 Survived 열의 개수만 출력

 

<예시5>

Pclass 열을 그룹화하여 행으로 표현하고, Age 열의 최대/최소값 출력

반응형
반응형

 

<예시6>

Pclass 열을 그룹화하여 행으로 표현하고, Age열과  Fare열의 최대/최소값 출력

 

<예시7>

Pclass 열을 그룹화하여 행으로 표현하고, Age열은 max값을, SibSp열은 sum값을, Fare열은 평균값을 출력

  

반응형

 

<예시8>

성별을 남자, 여자로 그룹지어서 평균 키와 키의 표준편차를 구한 데이터프레임 생성

 

<예시9>

강의실 별 이용 시간수를 출력, 별도의 index를 발번(as_index=False)

반응형

 


11) 결손 데이터(NaN값)

 

*_df.isna() : *_df 데이터프레임의 NaN 여부 확인 (True인 경우, NaN값 존재)

*_df.isna().sum() : *_df 데이터프레임의 NaN 개수 출력

*_df.isna() : *_df 데이터프레임의 NaN 여부 확인 (True인 경우, NaN값 존재)

*_df ['열이름_a'] = *_df['열이름'].fillna('~~~') : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 맨 마지막 열에 열이름_a를 추가하여 NaN→~~~로 변경한 열 추가

 *_df ['열이름'] = *_df['열이름'].fillna('~~~') : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 해당 열의 NaN→~~~로 값 변경

*_df['열이름'].fillna('~~~', inplace=True) : *_df 데이터프레임의 특정 열의 NaN이 존재하는 경우, 해당 열의 NaN→~~~로 값 변경 ( *_df ['열이름'] = *_df['열이름'].fillna('~~~') 명령어와 동일한 결과 리턴)

 

 

<예시1>

titanic_df 데이터프레임의 NaN값 유무 확인 (Cabin에서 True보임에 따라 Cabin 열에 NaN값이 존재한다.)

 

<예시2>

각 열마다 NaN값이 몇개 존재하는지 확인

 

반응형
반응형

 

<예시3>

titanic_df 데이터프레임의 Cabin 열에 NaN값이 있으면 맨 마지막 열에 Cabin_Updated 열을 추가하여 NaN → C000으로 변경

 

<예시4>

In [122] : titanic_df 데이터프레임의 Cabin 열에 NaN값이 있으면 해당 열을 NaN → C000으로 변경

In [123] : titanic_df 데이터프레임의 Cabin 열에 NaN값이 있으면 해당 열을 NaN → C000으로 변경 (In [122]와 동일한 결과)

반응형

 


12) 람다표현식으로 함수생성

 

변수명= lambda x: 수식

print(변수명(x))

:: 간단한 수식을 람다표현식으로 함수 생성 후, 그 결과를 출력

list(map(lambda x: 수식, [리스트 값])) : 리스트 값에 람다표현식으로 생성한 함수를 모두 적용

*_df['열이름_a']=*_df['열이름'].apply(lambda x: 수식) : *_df 데이터프레임에 특정 열의 값을 람다표현식의 함수를 적용하여 나온 값들을 마지막 열(열이름_a)에 저장

*_df['열이름_a']=*_df['열이름'].apply(lambda x: 'A' if x>5 else 'B') : *_df 데이터프레임에 특정 열의 값을 5보다 크면 A, 작으면 B로 리턴하여 마지막 열(열이름_a)에 저장

 

 

<예시1>

람다표현식으로 lambda_square 함수명으로 생성. 3을 인자로 넣어 9를 반환받음

반응형

 

<예시2>

[1,2,3] 리스트를 생성하고, 모든 리스트 값에 람다표현식을 적용하여 [1,2,3] → [1,4,9]를 반환받음

 

<예시3>

titanic_df 데이터 프레임의 Name 열의 각 항목들의 문자열 길이를 구하는 람다표현식을 적용하여 그 결과를 Name_len열에 저장한다. (Name_len 열은 새로 생성된 열임)

 

 

<예시4>

 Age 열의 값이 15이하이면 Child, 초과이면 Adult로 리턴하여 Child_Adult(마지막열)에 저장

반응형

 

<예시5>

(L1) : Age 열의 값이 15이하이면 Child, 60이상이면 Elderly, 그 사이면 Adult로 리턴하여 Age_cat(마지막열)에 저장

(L2) : Child, Adult, Elderly로 구분된 Age_cat 열의 각각 개수를 출력

 

 

<예시6>

나이별로 그 결과값을 리턴해주는 get_category 함수를 생성하여 람다표현식의 수식부분에 get_category함수를 적용하였음.

수식을 정리하면, 람다표현식(get_category함수(x)) 형태이다.

get_category함수에서 반환된 값들을 Age_cat 열에 저장

반응형

 

반응형

   <Practice> :: 강의 시간표 분석

 

 

 

위의 표의 데이터로 판다스 데이터프레임을 생성하고 시간표 데이터를 분석해 봅시다.

 

 

1. 위 표를 참고하여 열 이름을 'col_names'로, 각 행의 정보를 'list1'으로 리스트 정의한다.

 

2. 1번에서 만든 'col_names'와 'list1'을 이용하여 데이터프레임 'df'을 생성하고 이를 'timetable.csv' 파일로 저장한다. (헤더,인덱스,인코딩타입은 각각 True, False, utf-8로 저장)

 

3. 'timetable.csv' 파일을 불러와서 'df2'에 저장하고, 마지막 열에 '교수' 열을 추가하고 ['김예희', '오정현', '인세훈', '이새봄', '배유진', '이가원']을 배정한다.

 

4. 강의실을 기준으로 그룹화하여 max()함수를 통해 강의실 최대 이용시간 현황을 'max_hour'에 저장하고 출력한다. (별도의 인덱스를 발번 할 것)

 

 

 

1.열 이름과 시간표 데이터를 리스트로 저장.

col_names = ['과목번호', '과목명', '강의실', '시간수']
list1 = list([['C1', '인공지능개론', 'R1', 3],
	['C2', '웃음치료', 'R2', 2],
	['C3', '경영학', 'R3', 3],
	['C4', '3D디자인', 'R4', 4],
	['C5', '스포츠경영', 'R2', 2],
	['C6', '예술의 세계', 'R3', 1]
	])

 

 

2. 시간표 데이터를 데이터프레임 객체 df로 변환하여 CSV 파일로 저장.

import pandas as pd
df = pd.DataFrame(list1, columns=col_names)
df.to_csv('./timetable.csv', header=True, index=False, encoding='utf-8')
반응형

 

 

3. timetable.csv’ 파일을 데이터프레임 객체 df2로 읽고, 열 이름이 ‘교수’인 열을 추가. 값으로 ‘김예희, ‘오정현’, ‘인세훈, ‘이새봄, ‘배유진’, ‘이가원’을 저장.
df2 = pd.read_csv('./timetable.csv', sep=',')
df2['교수'] = ['김예희', '오정현', '인세훈', '이새봄', '배유진', '이가원']
df2

 

4. 강의실을 기준으로 그룹화하여 max( ) 함수로 최대 시간 수를 구하기.

max_hour = df2.groupby(by=['강의실'], as_index=False)['시간수'].max()
max_hour

반응형

 

반응형