ETC| Pandas
in Blog / ETC on Pandas
Pandas 튜토리얼
해당 포스트는 ‘파이썬 머신러닝 완벽가이드(권철민 지음)’ 를 공부하면서 작성하였습니다.
- 넘파이의 데이터 핸들링은 편하다고 하기에는 애매, 저수준 API가 대부분
판다스는 넘파이 기반으로 작성, 데이터 핸들링을 가능하게 해줌
- DataFrame: 여러 개의 행과 열로 이뤄진 2차원 데이터를 담는 구조체
- Series: 칼럼이 하나인 구조체
- Index: Key, dataframe, series 모두 index를 key값으로 가짐
Pandas 개요
- read_csv(), read_table(), rad_fwf()
- info(): 총 데이터 건수와 타입, Null 건수를 알 수 있음
- describe(): 칼럼별 숫자형 데이터값의 n-percentile 분포도, 평균도, 최댓값, 최솟값을 나타냄(오직 숫자형, object는 출력에서 제외)
- value_counts(): 지정된 칼럼의 데이터값 건수를 반환
DataFrame과 리스트, 딕셔너리, 넘파이 ndarray 상호 변환
ndarray, list, dict -> DataFrame
- pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=None)
DataFrame -> ndarray, list, dict
- values, tolist(), to_dict()
DataFrame의 칼럼 데이터 세트 생성과 수정
- DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’)
Index 객체
- 판다스의 Index 객체는 RDBMS의 PK와 유사하게 DataFrame, Series의 레코드를 고유하게 식별하는 객체
- DataFrame.index, Sereis.index: DataFrame, Series에서 Index 객체만 추출
데이터 셀렉션 및 필터링
- 넘파이와 유사한 부분도 있고 다른 부분이 있어 혼동하기 쉬움
- 넘파이 ‘[]’ 연산자: 단일 값 추출, 슬라이싱, 팬시 인덱싱, 불린 인덱싱
- 판다스 ‘[]’ 연산자: ix[], iloc[], loc[]
DataFrame의 [] 연산자
- 넘파이: 행과 열의 위치, 슬라이싱 범위 등
판다스: 칼럼 명 문자 또는 인덱스로 변환 가능한 표현식
- ix[]
- 넘파이와 유사한 기능을 제공하기 위해 판다스 개발 초기에 제공
- ix[0, ‘Pclass’], ix[0, 2]처럼 칼럼 명칭 기반 인덱싱과 칼럼 위치 기반 인덱싱을 모두 제공하게 되면서 혼돈을 주거나 가독성이 떨어져 사라짐
- iloc[]
- 위치 기반 인덱싱만 허용
- loc[]
- 명치 기반 인덱싱만 허용
- 슬라이싱 사용시 종료값 -1이 아닌 종료값까지 포함
- 불린 인덱싱
정렬, Aggregation 함수, GroupBy()
- DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind=’quicksort’, na_position=’last’, ignore_index=False, key=None)[source]
- by: 정렬할 칼럼
- ascending=True: 오름차순
- inplace=True로 설정하면 DataFrame의 정렬 결과를 그대로 적용
- Aggregation
- min(), max(), sum(), count()와 같은 Aggregation 함수의 적용은 SQL과 유사, 다만 모든 칼럼에 적용한다는 차이가 있음
- groupby()
- GroupBy된 DataFrame Groupby 객체를 반환
- SQL과 유사하지만…
- 반환된 결과에 aggregation 함수를 호출하면 groupby() 대상 칼럼을 제외한 모든 칼럼에 aggregation 함수 적용
- groupby()에 특정 칼럼만 aggregation 함수 적용하려면 groupby()로 반환된 객체에 해당 칼럼을 필터링한 뒤 적용
titanic_groupby = titanic_df.groupby('Pclass')[['PassengerId', 'Survived']].count()
- 서로 다른 aggregation 함수를 적용
titanic_df.groupby('Pclass')['Age'].agg([max, min])
결손 데이터 처리
- isna(): NaN 여부 확인
- fillna(): NaN 값을 다른 값으로 대체
apply lambda식으로 데이터 가공
titanic_df['Name_len'] = titanic_df['Name'].apply(lambda x: len(x))
titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x: 'Child' if x<=15 else ('Adult' if x<=60 else 'Elderly'))