정렬 

 

DataFrame과 Series를 정렬하는 데에는 .sort_values() 함수를 사용한다. 해당 함수는 DataFrame과 Series에서 특정 칼럼의 값으로 정렬을 하는 경우에 사용한다. 

파라미터 : by / ascending / inplace


by :
어떤 칼럼의 데이터 값을 기준으로 정렬을 할 것인지에 대해서 해당 열의 이름을 인자로 넣어준다. 

ascending(= True) : 디폴트 값이 True이고 True로 한다면 오름차순으로, False는 내림차순으로 정렬한다. 

inplace : 이전의 함수들과 동일한 역할을 하는 파라미터이므로 별도의 설명을 생략한다. 

 

import pandas as pd
import numpy as np 

titanic_df = pd.read_csv('train.csv')

titanic_sorted = titanic_df.sort_values(by = ['Name'])
titanic_sorted.head(3)

titanic_sorted = titanic_df.sort_values(by=['Pclass', 'Name'], ascending = False)
titanic_sorted.head(3)

 

 

 

 

 

Aggregation 함수 

 

Aggregation 이라는 단어는 '집합'을 의미한다.

min(), max(), sum(), count() 등의 기본 연산을 도와주는 함수들의 집합이다. 

 

대부분 이전에 공부할 때 많이 사용해 본 적이 있을 것이다 . 하지만, 판다스에서 조금 다르게 작용하는 부분은 DataFrame의 경우, 별도로 지정해주지 않으면 모든 열에 대해서 해당 연산을 수행한다는 점이다. 



titanic_df.count()

titanic_df[['Age', 'Fare']].mean()

이런 일을 막기 위해서는 Aggregation 함수 앞에 열의 이름을 입력해주면 해당 열만 연산이 가능하다. 

 

 

Groupby() 

 

 

 

해당 메서드는 앞으로 분석작업을 하는 경우에 많이 사용하게 될 .groupby()이다. 
by라는 파라미터에 원하는 열을 인자로 넣어주면 입력한 열의 value 값을 기준으로 데이터들이 묶여서 출력된다. 

또한, groupby를 단독으로 사용하기 보다는 앞에서 언급한 Aggregation 함수와 함께 사용하는 경우가 많다. 이렇게 사용하게 되면, groupby 에서 기준이 되는 열을 제외한 나머지 열들이 해당 연산이 되어서 출력되는 것을 확인할 수 있다. 

추가적으로 Aggregation 함수를 하나만 사용하지 않고, 복수 개를 사용하는 경우에는 
.agg(['함수1, '함수2', .... ])의 형태로 입력을 해준다.

세번쨰로 groupby한 데이터에 각 열마다 별도의 Aggregation 함수를 적용해주고 싶다면, 해당 열과 원하는 함수를 각각 key, value 값으로 가지는 딕셔너리를 만들고, agg() 매서드 안에 해당 딕셔너리를 인자로 넣어주면 된다. 

 

 

titanic_groupby = titanic_df.groupby(by='Pclass')
print(type(titanic_groupby))

titanic_groupby = titanic_df.groupby('Pclass').count()
titanic_groupby

titanic_groupby = titanic_df.groupby('Pclass')[['PassengerId', 'Survived']].count()
titanic_groupby


titanic_df.groupby('Pclass')['Age'].agg(['max', 'min'])

agg_format = {'Age' : 'max', 'SibSp' : 'sum', 'Fare': 'mean'}
titanic_df.groupby('Pclass').agg(agg_format)

 

 

 

 


 

 

결손 데이터 (Null Data) 처리

 

앞으로 데이터를 보다보면 입력이 되지 않은 결손 데이터가 많이 존재한다는 것을 보게 될 것이다. 해당 행, 열의 결손 데이터가 일정 비율 이상이라면 삭제해주는 편이 나을 수도 있지만, 얼마 되지 않는다면 평균 값 등으로 결손 데이터를 임의로 채워야 하는 경우가 발생한다. 

물론 DataFrame, Series에서 그것들의 위치를 알아내어 결손 값을 채울수도 있지만, 판다스를 이용하여 더욱 편리한 방법으로 이런 결손값들을 처리할 수 있다. 

 

 

결손값 확인 -> isna()

 

해당 DataFrame에서 isna() 메서드를 이용하면 각 데이터들이 들어있는 위치에 True / False의 Bool 값으로 변환되어 출력된다. 결손값이 존재하는 부분에는 True, 아닌 부분에는 False가 들어간다.

하지만, 대부분은 결손값의 위치보다 칼럼에서 결손값이 얼마나 존재하는지 알아보는 경우가 일반적이다. 이것을 위해서는 isna().sum()을 해주면, 각 칼럼마다 NaN 값이 얼마나 존재하고 있는지 수치로 표현된다. 

titanic_df.isna().head(3)

titanic_df.isna().head(3)

 

 

결손값 채우기 -> fillna()

 

위에서 언급한 isna() 메서드를 통해서 결손값이 너무 많은 데이터는 삭제를 해주는 것이 예측 성능에 오히려 도움이 되고, 데이터의 개수에 비해서 결손값이 아주 작은 경우는 일반적으로 해당 값들의 평균을 넣어주는 경우가 대부분이다. 

titanic_df['Cabin'] = titanic_df['Cabin'].fillna('C000')
titanic_df.head(3)

 

이렇게 결손값을 채워주면 된다. 


예제에서도 보이듯이, 함수들을 단독으로 사용하기 보다는, 여러 함수들 (특히 Aggregation 함수는 이곳저곳에 많이 쓰인다.) 이 동시에 사용되는 것을 자주 확인할 수 있다. 각각의 함수에 대해서 정확하게 이해를 하고 있지 못하다면, 코드를 보면서 전반적인 이해는 가능하겠지만, 완벽하게 이해를 할 수 없다. 이 말은 자신이 원하는대로 응용하여 사용할 수 없다. 이렇게 자신이 원하는 방향으로 데이터를 처리하기 위해서는 함수 하나하나의 정확한 이해가 필요하다. 

 

 

 

Apply / Lambda

 

.apply()와 lambda의 개념이 생소할 수도 있다. lambda는 임의로 함수를 즉석에서 만들어주는 역할을 한다. 

왜 별도로 함수를 정의하지 않고 굳이 lambda를 사용하는가? 

 

1. 별도의 함수를 정의할만큼 많이 사용되지 않는다. 


전체 코드에서 한번이나 두번정도 사용될 경우에는 코드가 길어지게 되면 오히려 코드를 더 이해하기 어렵게 만든다. 

 

2. 별도의 함수를 정의할 만큼 복잡하지 않다. 


이 기준은 조금 애매할 수도 있다. 별도로 해당 연산을 제공하는 API가 없지만, 그렇다고 별도의 함수를 만들기에는 너무 간단한 경우에 사용한다. 예를 들어 x**2 + 3 * x + 4의 경우 이 연산 한번을 위해서 별도로 함수를 만드는 것 치고는 너무 간단하다. 

위와 같은 경우에 Lambda 함수를 사용하는 것이다. 
.apply() 메서드는 lambda 함수를 담는 그릇이라고 생각하면 된다. 

 

titanic_df['Name_len'] = titanic_df['Name'].apply(lambda x : len(x))
titanic_df[['Name', 'Name_len']].head(3)

 

Lambda 함수에서 if/ else를 구현하는 것이 가능하지만 else if를 사용하는 것을 불가하다. 밑의 예제 처럼 하나정도를 만드는 것은 괜찮지만, 2개 이상의 else if를 사용해야 하는 경우에는 별도의 함수를 정의해주는 것이 좋다. 

 

titanic_df['Child_Adult']  = titanic_df['Age'].apply(lambda x : 'Child' if x <= 15 else 'Adult')
titanic_df[['Age', 'Child_Adult']].head(8)

titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x : 'Child' if x<=15 else('Adult' if x<= 60 else 'Elderly'))
titanic_df['Age_cat'].value_counts()

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기