dev/ai

[AI] 판다스(Pandas) 데이터 프레임(DataFrame)

캄춰 2023. 11. 15. 10:35
728x90
반응형

Pandas의 목적은 데이터프레임을 만들기 위한, 사용하기 위한 목적으로 봄

흔히 보는 '테이블'형태로 보기 좋게 만들어서 분석할 수 있게 해주는 것이며,

: csv, excel, db를 읽을 수 있음

 

데이터 프레임은 행(인덱스:index, 로우:row)과 열(컬럼:column)으로 이루어져 있다.

둘 다 명시가 되어있지 않는 경우 자동으로 0부터 1씩 증가하여 표시가 된다.

 

판다스(Pandas) 라이브러리 불러오기

import pandas as pd

 

 

데이터 프레임을 만드는(생성) 함수

list, dictionary, numpy.array배열로부터 데이터프레임 생성

pd.DataFrame()
# dictiony → dataframe
test_dict = {'name' : ['kam', 'hong', 'kk', 'jiyoung'], 'age' : [30, 32, 26, 28]}

test_dataframe = pd.DataFrame(test_dict)
  name age
0 kam 30
1 hong 32
2 kk 26
3 jiyong 28

 

 

CSV파일 읽어서 데이터프레임 만들기

파라메터 옵션

: usecols = 사용할 컬럼

: sep = 구분자(기본: ' , ' 콤마)

: header = 헤더 행 번호 지정(기본: 0)

: index_col = 인덱스 숫자 표시(기본:False)

: names = 열 이름 지정

:skiprows = 0행 ~ 지정한 행까지 무시? skip

pd.read_csv()

 

 

구글 드라이브 내의 파일(csv)에 접근하고 싶은 경우

2023.11.15 - [dev/ai] - [AI] 구글(Google) 코랩(Colab) 드라이브 연결

 

 

데이터 확인 함수

: dataframe.head() = 상위 데이터 확인(기본:5개)

: dataframe.tail() = 하위 데이터 확인(기본:5개)

: dataframe.shape = 데이터 프레임 크기 확인

: dataframe.index = 인덱스 정보

: dataframe.values = numpy.array형태로 배열 값으로 값 출력

: dataframe.columns = 데이터 프레임의 컬럼 출력

: dataframe.dtypes = 컬럼 타입 확인

: dataframe.info( ) = 데이터 프레임의 개수, 타입 등 상세한 정보 확인

: dataframe.describe( ) = 기초통계정보, 개수, 중간값, 등 출력하여 나타냄

 

 

데이터 정렬

dataframe.sort_values()

: by = 특정 컬럼(열)을 지정, 리스트 형태

: ascending = True : 오름차순(기본값:ASC) / False : 내림차순(DESC)

 

 

고유값 확인

: dataframe['testColumn1'].unique( ) = testColumn1이 갖고 있는 값을 배열로 출력

 

고유값과 개수

: dataframe['testColumn2'].value_counts( ) = testColumn2의 고유값과 개수 출력

 

 

집계

: dataframe['testColumn1'].sum( ) = 컬럼(열)의 합계

: dataframe['testColumn2'].max( ) = 컬럼(열)의 최대값 확인

: dataframe[['testColumn3, 'testColumn4']].mean( ) = 각 컬럼의 평균값 확인

: dataframe[['testColumn5', 'testColumn6']].median( ) = 각 컬럼의 중앙값 확인

 

 

시리즈(Series)란?

데이터 프레임의 컬럼(열)의 데이터 '하나'만 출력한 것

: 조회 방법은 두 가지

dataframe = pd.DataFrame(somethingArray)

# 조회 방법
dataframe.column1
dataframe['column1']

 

 

 

조건 조회

 1. datafrome.loc[ ]    // 대괄호

: 데이터프레임의 column1값이 10보다 큰 것을 조회

: dataframe.loc[dataframe['column1'] > 10]

 

2. dataframe.loc[ dataframe[column].isin(리스트) ]

: 리스트에 있는 값만 조회

: 데이터프레임 column2에서 1, 7 ,19 값만 조회

: dataframe.loc[dataframe['column2'].isin[(1, 7, 19)]

 

3. dataframe.loc[ dataframe[column].between(시작 값, 마지막 값) ]

: 시작 값 부터 마지막 값까지 구매

: dataframe.loc[ (datafrome[column] >= 시작 값) & (dataframe[column] <= 마지막 값)] 과 동일

 

numpy where로 확인

4. np.where(dataframe[column].isin([값1, 값2, 값3...]), 참인 경우, 거짓인 경우)

 

 

조건을 만족하는 열 조회

: dataframe.loc[ 조건, 열 리스트 ]

 

 

특정 열을 집계하여 원하는 값 조회

: dataframe.groupby(by=집계할 열이름 리스트, as_index=True)[값을 원하는 열 리스트].sum( )

: as_index = True : 열 이름이 인덱스(기본값) / False : 숫자로 인덱스

: sum( ), 집계할 함수, sum, mean, median 등등..

 

여러 함수로 집계

: dataframe.groupby().agg(열 리스트)

: data = dataframe.groupby(by=['column1', 'column2'], as_index=False)['column3'].agg(['min', 'max', 'mean'])

 

 

이름 변경

: .rename, inplace= True : 바로변경 / False : 단순 리턴

일부 열 이름 변경

: dataframe.rename(columns={변경하고픈 컬럼명1 : 바꿀 컬럼명, 변경하고픈 컬럼명2 : 바꿀 컬럼명}, inplace=True)

 

모든 열 이름 변경

: dataframe.columns = 컬럼명 리스트

: dataframe.columns = ['column1', 'column2', 'column3', 'column4']

 

 

열 삭제

: labels = 컬럼 명

: axis = 0 : 행 / 1 : 열

: inplace = True : 즉시 적용 / False : 반환만

: dataframe.drop(삭제할 열 리스트, axis=1, inplace=True)

 

 

열의 전체 행 값 변환 : map()

: dataframe['column1']  = dataframe['column1'].map({'value1' : 0, 'value2' : 1})

: dataframe['Gender'] = dataframe['Gender'].map({'male':1, 'female':0})

 

 

pd.cut( ) : 범위를 등분할 수 있음

: pd.cut(x = 데이터프레임, bins= 나눌 개수, labels= 나눌 값 리스트)

: pd.cut(dataframe['column1'], 3, labels=['a', 'b', 'c'])

: column1을 3등분 하여 a, b, c로 행 값을 넣음

: bin으로 범위 지정 -np.inf : 음의 영역 무한, np.inf : 양의 영역 무한

: 값의 범위 0<= a  <10 이렇게 표현하고 싶은 경우 right=False 옵션을 넣음

bin = [0, 10000, 15000, np.inf]
data['M_Income_Group2'] = pd.cut(x = data['M_Income'], bins = bin, labels=['a', 'b',' c'])
data.groupby(by='M_Income_Group2', as_index = False)['M_Income'].agg(['min', 'max'])

 

응용> 타이타닉 Age범위를 10대, 20대 ~ 80대로 나누기

# bins 범위
bin =[i for i in range(0, 80+1, 10)]
bin.append(np.inf)

# labels 범위
bin_labels = [(str(i) + '대') for i in range(0, 80+1, 10)]
bin_labels

# 적용
pd.cut(x=titanic['Age'], bins=bin, labels=bin_labels, right=False)

 

 

 

인덱스 초기화

: 만약에 특정 날짜 만큼 데이터를 없앤 경우 기존 인덱스만이 남아서 값이 0부터가 아닐 때가 있다.

: 이떄 '0'부터 다시 index를 조정하는 방법이 있다.

: dataframe.reset_index( )

# date가 2017-12-01보다 큰 것만
data = data.loc[data['date'] >= '2017-12-01']
data.head()

 

 

data.reset_index(level=0, drop=True, inplace=True)
data.head()

728x90
반응형