220917

AIVILLAIN·2022년 9월 17일
0

오공완

목록 보기
8/25

판다스(pandas)는 파이썬에서 데이터 처리를 위해 존재하는 가장 인기 있는 라이브러리
대부분의 데이터 세트는 행과 열로 구성된 2차원 데이터
인간이 가장 이해하기 쉬운 데이터 구조이면서도 효과적으로 데이터를 담을 수 있는 구조
2차원 데이터를 효율적으로 가공/처리할 수 있는 다양하고 훌륭한 기능 제공

파이썬 Kaggle API 사용하기

(WSL 2 Ubuntu 환경 기준)
pip install kaggle
kaggle.com 로그인 후 프로필 → account 클릭
화면 내려서 API 부분 찾고 Create New API Token 클릭
kaggle.json 파일 C드라이브로 이동
WSL 2 환경에서
mv /mnt/c/kaggle.json ~/.kaggle/
이후 사용 가능

파일을 DataFrame으로 로딩, 기본 API

판다스는 다양한 포맷으로 된 파일을 DataFrame으로 로딩할 수 있는 API 제공
read_csv(), read_table(), read_fwf()
read_table()과 read_csv()의 가장 큰 차이는 필드 구분 문자(delimeter)가 콤마냐 탭(\t)이냐의 차이
read_table()의 디폴트 필드 구분 문자는 탭
read_csv()는 CSV 뿐만 아니라 어떤 필드 구분 문자 기반의 파일 포맷도 DataFrame으로 변환이 가능
read_csv()의 인자인 sep에 해당 구분 문자를 입력하면 됨
read_fwf()는 fixed width 고정 길이 기반의 칼럼 포맷을 DataFrame으로 로딩하기 위한 API

pd.read_csv()는 호출 시 파일명 인자로 들어온 파일을 로딩해 DataFrame 객체로 반환
별다른 파라미터 지정이 없으면 파일의 맨 처음 로우를 칼럼명으로 인지하고 칼럼으로 변환
콤마로 분리된 데이터값들이 해당 컬럼에 맞게 할당
가장 좌측에는 판다스의 Index 객체 값
모든 DataFrame 내의 데이터는 생성되는 순간 고유한 Index 값을 가짐
인덱스는 RDBMS의 PK와 유사하게 고유의 레코드를 식별하는 역할을 함

DataFrame.head(N)는 DataFrame의 맨 앞에 있는 N개의 로우를 반환
Default는 5개

DataFrame의 행과 열 크기를 알아보는 가장 좋은 방법은 생성된 DataFrame 객체의 shape 변수를 이용하는 것
DataFrame의 행과 열을 튜플로 반환

DataFrame은 데이터뿐만 아니라 칼럼의 타입, Null 데이터 수, 데이터 분포도 등 메타 데이터 등도 조회 가능
info() 메서드를 통해 총 데이터 건수와 데이터 타입, Null 건수를 알 수 있음
describe() 메서드는 컬럼 별 숫자형 데이터값의 n-percentile 분포도, 평균값, 최댓값, 최솟값을 나타냄
describe() 메서드는 오직 숫자형 칼럼의 분포도만 조사하여 자동으로 object 타입의 칼럼은 출력에서 제외

데이터의 분포도를 아는 것은 머신러닝 알고리즘 성능 향상을 위해 중요
회귀에서 결정 값이 정규 분포를 이루지 않고 특정 값으로 왜곡돼 있는 경우, 또는 데이터값에 이상치가 많을 경우 예측 성능이 저하

DataFrame의 [] 연산자 내부에 컬럼명을 입력하면 Series 형태로 특정 컬럼 데이터세트가 반환됨
이렇게 반환된 Series 객체에 value_counts() 메서드를 호출하면 해당 컬럼값의 유형과 건수를 확인할 수 있음
많은 건수 순서로 정렬되어 값을 반환
DataFrame의 [] 연산자 내부에 컬럼명을 입력하면 해당 컬럼에 해당하는 Series 객체 반환

Series는 Index와 단 하나의 컬럼으로 구성된 데이터 세트
value_counts() 메서드는 DataFrame에는 없고 Series 객체에만 있음
value_counts() 메서드 반환 데이터 타입 역시 Series
반환된 Series 객체 값을 보면 맨 왼쪽은 인덱스, 오른쪽은 데이터 값
인덱스는 단순히 순차 값과 같은 의미없는 식별자만 할당하는 것이 아닌 고유성이 보장된다면 의미 있는 데이터값 할당도 가능
인덱스 또한 숫자형 뿐만 아닌 문자열도 가능
단 모든 인덱스는 고유성이 보장되어야 함

DataFrame과 리스트, 딕셔너리, 넘파이 ndarray 상호 변환

기본적으로 DataFrame은 파이썬의 리스트, 딕셔너리 그리고 ndarray 등 다양한 데이터로부터 생성될 수 있음
반대로 변환 또한 가능
사이킷런의 많은 API는 DataFrame을 인자로 입력 받을 수 있지만 기본적으로는 넘파이 ndarray를 입력 인자로 사용하는 경우가 대부분
DataFrame과 ndarray 상호 간의 변환은 매우 빈번하게 발생

넘파이 ndarray, 파이썬 리스트, 딕셔너리로부터 DataFrame 생성
DataFrame은 리스트와 넘파이 ndarray와 다르게 컬럼명을 가짐
DataFrame 객체의 생성 인자 data는 리스트나 딕셔너리, ndarray를 입력 받고 생성 인자 columns는 컬럼명 리스트를 입력 받아서 DataFrame 생성 가능

DataFrame은 기본적으로 행과 열을 갖는 2차원 데이터
2차원 이하의 데이터들만 DataFrame으로 변환 가능

Dataframe을 ndarray로 변환하는 것은 DataFrame 객체의 values를 사용
리스트로의 변환읜 values로 얻은 ndarray에 tolist() 메서드 호출
딕셔너리로 변환은 DataFrame 객체의 to_dict() 메서드 호출
인자로 list를 입력하면 딕셔너리의 값이 리스트형으로 반환됨

DataFrame의 컬럼 데이터 세트 생성과 수정

DataFrame의 컬럼 데이터 세트 생성과 수정 역시 [] 연산자 사용
DataFrame[] 내에 새로운 컬럼명을 입력하고 값을 할당해주면 됨
Series에 상숫값을 할당하면 Series의 모든 데이터 세트에 일괄적으로 적용

DataFrame 내 기존 컬럼 값은 업데이트를 원하는 Series를 DataFrame[] 내에 컬럼 명으로 입력한 뒤 값을 할당

DataFrame 데이터 삭제

데이터의 삭제는 DataFrame의 drop() 메서드 사용

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')

labels, axis, inplace가 중요한 파라미터
axis 값에 따라 특정 컬럼 혹은 특정 행을 drop
0은 행, 1은 열방향
drop() 메서드에 axis=1을 입력하면 컬럼을 drop
labels에 원하는 컬럼 명을 입력하고 axis=1을 입력하면 지정된 컬럼을 drop
axis를 0으로 지정하면 DataFrame은 자동으로 labels에 오는 값을 인덱스로 간주
drop() 메서드가 사용되는 대부분의 경우는 컬럼을 드롭하는 경우

inplace는 default 값이 False
False이면 자기 자신의 DataFrame의 데이터는 삭제하지 않으며 삭제된 결과 DataFrame 반환
inplace=True로 설정하면 자신의 DataFrame에서 데이터를 삭제
여러 개의 컬럼을 삭제하고 싶으면 리스트 형태로 삭제하고자 하는 컬럼명을 입력해 labels 파라미터로 입력
반환 값이 None
inplace=True로 설정한 채로 반환 값을 다시 자신의 DataFrame 객체로 할당하면 안됨

Index 객체

판다스의 Index 객체는 RDBMS의 PK와 유사하게 DataFrame, Series의 레코드를 고유하게 식별하는 객체
Index 객체만 추출하려면 DataFrame.index 또는 Series.index 속성을 통해 가능
Index 객체는 식별성 데이터를 1차원 array로 가지고 있음
ndarray와 유사하게 단일 값 반환 및 슬라이싱 가능
Index 객체는 함부로 변경할 수 없음
Series 객체는 Index 객체를 포함하지만 Series 객체에 연산 함수를 적용할 때 Index는 연산에서 제외됨
Index는 오직 식별용으로만 사용됨

DataFrame 및 Series에 reset_index() 메서드를 수행하면 새롭게 인덱스를 연속 숫자 형으로 할당하며 기존 인덱스는 index라는 새로운 칼럼 명으로 추가
reset_index()는 인덱스가 연속된 int 숫자형 데이터가 아닐 경우 다시 이를 연속 int 숫자형 데이터로 만들 때 주로 사용
drop=True로 설정하면 기존 인덱스는 새로운 컬럼으로 추가되지 않고 삭제됨

데이터 셀렉션 및 필터링

numpy의 데이터 핸들링은 데이터 분석용으로 사용하기에는 편의성이 떨어짐
pandas는 이를 개선하려고 노력하는 과정에서 numpy 기능을 계승하기도, 완전히 다른 기능을 제공하기도 함

넘파이의 경우 [] 연산자 내 단일 값 추출, 슬라이싱, 팬시 인덱싱, 불린 인덱싱을 통해 데이터를 추출
판다스의 경우 ix[], iloc[], loc[] 연산자를 통해 동일한 작업 수행

DataFrame의 [] 연산자

넘파이에서 [] 연산자는 행의 위치, 열의 위치, 슬라이싱 범위를 지정해 데이터를 가져올 수 있음
DataFrame 바로 뒤에 있는 [] 안에 들어갈 수 있는 것은 컬럼 명 문자, 인덱스로 변환 가능한 표현식
DataFrame의 [] 내에 숫자 값을 입력할 경우 오류가 발생하며, 판다스의 인덱스 형태로 변환 가능한 표현식은 [] 내에 입력할 수 있음
불린 인덱싱도 가능

DataFrame의 ix[] 연산자

행 위치 지정으로 인덱스값, 열 위치 지정으로 컬럼 명 혹은 인덱스값을 입력해 원하는 위치의 데이터 추출 가능
향후 사라질 예정으로 loc[] 또는 iloc[] 사용 권장

명칭 기반 인덱싱과 위치 기반 인덱싱

명칭(Label) 기반 인덱싱은 컬럼의 명칭을 기반으로 위치 지정
위치 기반 인덱싱은 0을 출발점으로 하는 행, 열 위치 기반의 데이터 지정

DataFrame의 iloc[] 연산자

위치 기반 인덱싱만 허용
행과 열 값으로 integer 또는 integer형 슬라이싱, 팬시 리스트 값 입력

DataFrame의 loc[] 연산자

명칭 기반 데이터 추출
행 위치에는 DataFrame index 값, 열 위치에는 컬럼 명 입력
loc[] 에서 슬라이싱 기호 사용 시 종료 값 - 1이 아닌 종료 값까지 포함

불린 인덱싱

명칭이나 위치 지정 인덱싱에서 가져올 값은 주로 로직이나 조건에 의해 계산한 뒤 ix[] 내의 행 위치, 열 위치 값으로 입력됨
처음부터 가져올 값을 조건으로 입력하면 자동으로 원하는 값을 필터링

정렬, Aggregation, GroupBy 적용

DataFrame, Series의 정렬 - sort_values()

DataFrame과 Series 정렬을 위해서는 sort_value() 메서드 이용
RDBMS SQL의 order by와 유사
주요 입력 파라미터는 by, ascending, inplace
by로 특정 컬럼을 입력하면 해당 컬럼으로 정렬 수행
ascending=True로 설정하면 오름차순으로 정렬 (default)
여러 개의 컬럼으로 정렬하려면 by에 리스트 형식으로 정렬하려는 컬럼을 입력하면 됨

Aggregation 함수 적용

DataFrame에서 min(), max(), sum(), count()와 같은 aggregation 적용
DataFrame에서 바로 호출할 경우 모든 컬럼에 적용

groupby() 적용

RDBMS SQL의 groupby와 유사하면서도 다른 면이 있음
DataFrame의 groupby() 사용 시 입력 파라미터 by에 컬럼을 입력하면 대상 컬럼으로 groupby 적용
DataFrameGroupBy라는 또 다른 형태의 DataFrame을 반환하게 됨
DataFrame에 groupby를 호출해 반환된 결과에 aggregation 함수를 호출하면 groupby 대상 컬럼을 제외한 모든 컬럼에 aggregation 함수 적용
SQL의 경우 groupby 적용 시 여러 컬럼에 aggregation 함수를 호출하려면 대상 컬럼을 모두 select 절에 나열해야 하는 것과는 다름
groupby() 결과에 특정 컬럼만 aggregation 적용하려면 해당 컬럼을 필터링한 뒤 aggregation 함수를 적용해야 함

SQL의 경우 서로 다른 aggregation 함수를 적용할 경우 Select 절에 나열하기만 하면 되지만 DataFrame groupby()의 경우 적용하려는 여러 개의 aggregation 함수명을 DataFrameGroupBy 객체의 agg() 내에 인자로 입력해서 사용함

여러 개의 컬럼이 서로 다른 aggregation 함수를 호출하려면 agg() 내에 입력 값으로 딕셔너리 형태로 aggregation이 적용될 컬럼들과 aggregation 함수를 입력

결손 데이터 처리

Missing Data 처리를 위한 편리한 API 제공
컬럼에 값이 없는 NULL인 경우를 의미
넘파이의 NaN으로 표시
머신러닝 알고리즘은 NaN값을 처리하지 않으므로 다른 값으로 대체해야 함
NaN 값은 평균, 총합 등의 함수 연산 시 제외가 됨
특정 컬럼의 100개 데이터 중 10개가 NaN인 경우 이 컬럼의 평균 값은 90개 데이터에 대한 평균
NaN 여부를 확인하는 API는 isna(), NaN값을 다른 값으로 대체하는 API는 fillna()

isna()로 결손 데이터 여부 확인

DataFrame에 isna()를 수행하면 모든 컬럼의 값이 NaN인지 아닌지를 True나 False로 알려줌
sum()을 호출 시 True는 내부적으로 1, False는 0으로 변환되므로 결손 데이터 수를 구할 수 있음

fillna()로 결손 데이터 대체하기

fillna()를 이용해 반환 값을 다시 받거나 inplace=True 파라미터를 fillna()에 추가해야 실제 데이터세트 값이 변경됨

apply lambda 식으로 데이터 가공

판다스 apply 함수에 lambda식을 결합해 DataFrame이나 Series의 레코드별로 데이터를 가공할 수 있음
컬럼에 일괄적으로 데이터 가공을 하는 것이 속도 면에서 더 빠르나 복잡한 데이터 가공이 필요할 경우 어쩔 수 없이 apply lambda를 이용

lambda 식

: 로 입력 인자와 반환될 입력 인자의 계산식을 분리
ex) lambda x : x 2
여러 개의 값을 입력 인자로 사용해야 할 경우 보통 map 함수 사용
map(lambda x : x
2, [1, 2, 3])

if else 절을 사용해서 조금 더 복잡한 가공 가능

profile
소신있는 오픈마인드

0개의 댓글