티스토리 뷰
판다스의 정렬, Aggregation 함수, GroupBy 메서드에 대해 알아봅시다.
DataFrame, Series를 정렬하기 위해 sort_values() 메서드를 이용합니다. 핵심 파라미터로는 by, ascending, inplace가 있으며, by를 통해 정렬의 기준이 되는 칼럼을 지정합니다.ascending은 디폴트로 True(오름차순)입니다.
DataFrame에서 min(), max(), sum(), count()와 같은 aggregation 메서드를 적용할 수 있습니다. DataFrame에서 이러한 메서드를 바로 호출할 경우 모든 칼럼에 대해 해당 연산을 수행합니다. 특히 count() 연산은 Null인 데이터를 연산에 포함시키지 않습니다. 특정 칼럼에만 연산을 적용시키기 위해서는 DataFrame에서 해당 칼럼들은 추출한 뒤 메서드를 적용하면 됩니다.
DataFrame의 groupby() 적용 시 by 파라미터에 칼럼을 입력하면 대상 칼럼으로 groupby를 수행합니다. 이때 메서드의 반환 객체는 DataFrameGroupBy라는 또 다른 형태의 DataFrame입니다. 해당 객체에 aggregation 함수를 호출하면 그룹바이 대상 칼럼을 제외한 모든 칼럼에 대해 aggregation 연산을 적용합니다.
당연히, 원하는 칼럼에 대해서만 aggregation을 수행할 수도 있습니다.
두 개 이상의 aggregation 연산을 적용하고 싶을 때는 agg() 함수의 인자에 리스트 형태로 원하는 연산을 묶어서 전달하면 됩니다.
바로 위에선 모든 칼럼에 대해 max, min이라는 두 연산을 적용했지만, 만약 칼럼마다 다른 연산을 수행하고 싶다면 어떻게 해야 할까요? 칼럼명을 key로, 연산을 value로 매칭한 딕셔너리를 agg() 함수의 인자로 전달하면 됩니다.
결손 데이터는 칼럼에 값이 없는, 즉 Null인 경우를 의미하며 이를 넘파이의 NaN으로 표시합니다. 머신러닝 알고리즘을 돌리기 전에 결손 데이터를 대체해야 합니다. 또한 NaN 값은 평균, 총합 등의 함수 연산 시 제외됩니다. 즉, 특정 칼럼에 100개의 데이터가 있고, 결손 데이터가 10개라면 sum() 함수를 적용할 시 90개의 데이터에 대한 합이 구해집니다. NaN 데이터 여부를 확인하기 위해 isna() 메서드를 사용할 수 있으며, NaN을 다른 값으로 대체하기 위해 fillna() 메서드를 사용합니다.
DataFrame에 isna()를 수행하면 모든 값에 대해 NaN인지의 여부를 불린값으로 반환합니다.
각 칼럼에 결손 데이터가 몇 개 있는지 확인하기 위해선 간단하게 isna().sum()을 호출하면 됩니다. sum()은 내부적으로 True를 1로, False를 0으로 처리합니다.
fillna() 메서드를 이용해 결손값을 대체해봅시다. 중요한 점은 fillna()를 통해 반환값을 다시 받거나(대입 연산자), fillna()의 inplace 메서드를 True로 설정해야 실제 데이터의 결손값이 대체된다는 점입니다.
나이(age)와 같은 숫자형 데이터를 평균값으로 대체했습니다. 모든 결손값이 대체된 것을 확인할 수 있습니다.
판다스는 apply 메서드에 lambda 식을 결합해 DataFrame이나 Series의 레코드별로 데이터를 가공할 수 있습니다. 한 칼럼에 대해 일괄적인 가공 처리를 하는 것이 속도면에서 더 이득이지만, 복잡한 데이터 가공을 위해선 어쩔 수 없이 apply lambda 기법을 이용합니다.
lambda 식은 파이썬에서 함수형 프로그래밍을 지원하기 위해 만들어졌습니다. 콜론의 왼쪽이 입력 인자이며, 오른쪽이 입력 인자를 통한 계산식(반환값)입니다. 여러 입력값에 대해 lambda 식을 적용하기 위해선 보통 map() 함수를 이용합니다.
apply lambda를 통한 데이터 가공의 예시입니다. 각 Name에 대한 길이를 구해 새로운 칼럼을 만들었습니다.
if else 구문을 이용한 조금 더 복잡한 가공의 예입니다. 나이가 15세를 초과하면 Adult로, 아니라면 Child로 매핑하여 새로운 칼럼을 만들었습니다. lambda 식에서 if else 구문이 어떻게 작성되었는 지에 주목합시다. if문이 먼저 오는 것이 아니라, 'Adult'라는 반환값이 먼저온 뒤에 조건이 옵니다. 이를 잘 기억합시다. 또한, elif는 지원하지 않습니다.
lambda 식 안에서 elif를 지원하지 않으므로, 조건분기가 많다면 그냥 별도의 메서드를 만들어서 사용하는 것이 간편합니다.
'파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
파이썬 머신러닝 완벽 가이드 : 사이킷런 기반 프레임워크 익히기 (0) | 2023.04.28 |
---|---|
파이썬 머신러닝 완벽 가이드 : 사이킷런 - 붓꽃 품종 예측하기 (0) | 2023.04.28 |
파이썬 머신러닝 완벽 가이드 : Pandas (2) (0) | 2023.04.06 |
파이썬 머신러닝 완벽 가이드 : Pandas (1) (0) | 2023.04.05 |
파이썬 머신러닝 완벽 가이드 : Numpy (0) | 2023.04.04 |