지난 포스팅에 이어 이번 포스팅에서도 데이터프레임을 다루는 여러 메서드에 대해 알아보도록 하겠습니다.
지금부터 정리할 함수들은 데이터를 전처리하는 과정에서 많이 사용하기 때문에 공식문서와 병행해 반복 학습하는 것을 추천합니다.
1. 데이터프레임 행과 열 삭제
drop 메서드를 사용하면 데이터프레임의 행과 열을 삭제할 수 있습니다.
아래 oil 예제 데이터프레임의 행과 열을 제거하는 예제를 살펴보겠습니다.
oil_0_off = oil.drop(0, axis=0)
oil_0_off.head()
axis=0 옵션으로 데이터프레임 행을 삭제할 수 있습니다.
제거할 행을 지정하기 위해 행 인덱스를 사용합니다.
위 코드를 실행하면 인덱스가 0인 행 데이터가 사라진 것을 알 수 있습니다.
oil_0_off.reset_index(drop=True).head()
행을 삭제하면 삭제된 행의 인덱스에 공백이 생깁니다.
인덱스 공백을 처리하기 위해 reset_index 메서드를 사용합니다.
drop=True 옵션을 설정하면 기존 인덱스를 데이터프레임의 컬럼으로 변환하지 않고 제거합니다.
위 코드를 실행하면 1부터 시작하던 행 인덱스가 0으로 재설정된 것을 알 수 있습니다.
oil_euro = oil.drop('price', axis=1)
oil_euro.head()
axis=1 옵션으로 데이터프레임의 열을 삭제할 수 있습니다.
제거할 컬럼을 지정하기 위해 컬럼명을 사용합니다.
위 코드를 실행하면 price 컬럼이 삭제됩니다.
2. 데이터프레임 중복
items = pd.DataFrame({
'product': ['Dairy', 'Dairy', 'Dairy', 'Vegetables', 'Fruits'],
'price': [2.56, 2.56, 4.55, 2.74, 5.44]
})
items
데이터프레임의 중복값을 처리할 때 2가지 메서드를 사용할 수 있습니다.
위 items 예제 데이터프레임의 중복값을 처리하면서 각 메서드에 대해 알아보겠습니다.
✅ duplicated 메서드
duplicated 메서드는 데이터프레임의 중복된 행을 나타내는 불리언 배열을 리턴합니다.
중복값이면 True, 중복되지 않은 고유값이면 False로 표시됩니다.
다음은 사용 가능한 매개변수 목록입니다.
- subset (중복 여부를 확인할 컬럼을 지정합니다.)
- keep (중복값들 중에 처음 혹은 마지막 값을 중복값으로 처리할지 지정합니다.)
- 'first' (중복값들 중 처음 등장하는 값은 False, 나머지 중복값들은 True로 표시합니다.)
- 'last' (중복값들 중 마지막에 등장하는 값은 False, 나머지 중복값들은 True로 표시합니다.)
- 'False' (모든 중복값들을 True로 표시합니다.)
items.duplicated()
# 0 False
# 1 True
# 2 False
# 3 False
# 4 False
# dtype: bool
매개변수 keep의 디폴트 값은 first입니다.
따라서 처음 등장하는 중복값만 False로 표시하고 나머지 중복값들은 True로 표시됩니다.
✅ drop_duplicates 메서드
items.drop_duplicates(subset='product', keep='last', ignore_index=True)
drop_duplicates 메서드는 중복된 행을 제거하고 새로운 데이터프레임을 리턴합니다.
사용 가능한 매개변수 목록은 기본적으로 duplicated 메서드와 동일합니다.
위 예제코드는 매개변수 subset을 통해 product 열의 중복값을 삭제합니다.
매개변수 keep의 인수로 last를 전달함으로써 중복값들 중 마지막만 남기고 나머지는 제거합니다.
매개변수 ignore_index를 True로 설정하면 행 인덱스에 공백이 생기지 않고 연속적으로 유지됩니다.
3. 데이터프레임 결측값
✅ 결측값 카운팅
products.isna().sum()
# product 2
# price 2
# product_id 0
# dtype: int64
isna 메서드를 사용하면 데이터프레임의 결측값을 표시하는 불리언 데이터프레임을 리턴합니다.
메서드 체이닝을 통해 isna 메서드가 리턴하는 데이터프레임에 대해 sum 메서드를 적용하면 컬럼별 결측값의 개수를 확인할 수 있습니다.
위 products 예제 데이터프레임의 product, price 컬럼에는 각각 2개의 결측값이 존재합니다.
products.info()
info 메서드를 사용해서 결측값의 개수를 확인할 수 있습니다.
행 인덱스의 총 개수와 컬럼별 non-null 값의 개수의 차이를 계산합니다.
✅ 결측값 제거
dropna 메서드는 결측값이 포함된 행을 삭제합니다.
다음은 자주 사용하는 매개변수입니다.
- how (결측값을 처리하는 방식을 지정합니다. 'all' 옵션을 설정하면 지정된 컬럼의 모든 값이 결측값인 경우에만 해당 행을 제거합니다. 'any' 옵션은 지정된 컬럼 중 하나의 값이라도 결측값인 경우에 해당 행을 삭제합니다.)
- subset (결측값 존재 여부를 확인할 열을 지정합니다.)
products.dropna()
매개변수 how의 디폴트 값은 any입니다.
따라서 위 예제코드는 결측값을 하나라도 갖는 행을 삭제합니다.
products.dropna(subset='price')
매개변수 subset은 결측값 존재 유무를 확인할 컬럼을 지정합니다.
위 예제코드는 price 열에 결측값이 존재하는 행을 삭제합니다.
✅ 결측값 처리
products.fillna({'price': 0})
fillna 메서드는 결측값을 다른 값으로 대체합니다.
위 예제코드는 price 열의 결측값을 0으로 대체합니다.
4. 데이터프레임 필터링
4-1. 비교 연산자
mask = ((oil['dcoilwtico'] > oil['benchmark'])
& (oil['date'].str[:4] == '2013'))
oil[mask]
비교연산자를 사용해서 2개 이상의 조건을 만족하는 데이터를 필터링할 수 있습니다.
4-2. query 메서드
oil.query(
'dcoilwtico > benchmark and date.dt.year == 2013'
)
query 메서드는 SQL 형식의 쿼리문을 사용해서 원하는 데이터를 가져옵니다.
쿼리문에 변수를 입력하기 위해서는 변수 앞에 '@' 기호를 명시해야 합니다.
5. 데이터프레임 정렬
✅ sort_index 메서드
sort_index는 인덱스를 기준으로 데이터프레임을 정렬합니다.
- axis=0 (행 인덱스를 기준으로 데이터프레임을 정렬합니다.)
- axis=1 (열 인덱스, 즉 컬럼명을 기준으로 데이터프레임을 정렬합니다.)
oil.sort_index(ascending=False)
위 예제코드는 인덱스를 기준으로 데이터프레임을 내림차순 정렬합니다.
✅ sort_values 메서드
oil.sort_values(['month', 'dcoilwtico'], ascending=[True, False])
sort_values 메서드는 데이터프레임의 값을 기준으로 데이터프레임을 정렬합니다.
위 코드는 month 컬럼을 기준으로 우선 오름차순 정렬하고, dcoilwtico 컬럼을 기준으로 다시 한 번 더 내림차순 정렬합니다.
6. 데이터프레임 컬럼 수정
✅ 컬럼명 변경
데이터프레임의 컬럼명을 바꾸는 2가지 방법이 존재합니다.
- columns 속성
- rename 메서드
✅ reindex 메서드
reindex 메서드를 사용하면 원하는 순서대로 컬럼을 정렬할 수 있습니다.
아래 예제 데이터프레임에 대해 rename, reindex 메서드를 적용해보겠습니다.
(
transactions
.rename(
columns={'transactions': 'transaction_count', 'store_nbr': 'store_number'}
)
.reindex(labels=['date', 'transaction_count', 'store_number'], axis=1)
)
우선 rename 메서드를 사용해서 컬럼명을 변경합니다.
이후에는 reindex 메서드를 통해 열의 순서를 재지정합니다.
7. 데이터프레임 컬럼 추가
7-1. 산술/비교 연산자
연산자를 사용해서 컬럼을 추가하는 일반적인 경우는 간단하기 때문에 넘어가겠습니다.
7-2. select 메서드
conditions = [
(oil['price'] > 100),
(oil['price'] <= 100) & (oil['price'] > 50),
(oil['price'] <= 50)
]
choices = [
"Don't Buy",
"Buy",
"Strong Buy"
]
oil['buy'] = np.select(conditions, choices, default='Missing')
oil
넘파이 라이브러리의 select 메서드는 조건별로 다른 값을 지정합니다.
위 코드는 price 컬럼의 값을 기준으로 서로 다른 범위 카테고리를 생성해서 카테고리별로 다른 값을 대응시켜 새로운 컬럼을 생성합니다.
7-3. assign 메서드
(
retail
.assign(
onpromotion_flag=retail['onpromotion'] > 0,
family_abbrev=retail['family'].str[:3],
onpromotion_ratio=retail['sales'] / retail['onpromotion'],
sales_onprom_target=lambda x: x['onpromotion_ratio'] > 100)
.query('sales_onprom_target == True')
)
assign 메서드를 사용하면 2개 이상의 컬럼을 동시에 추가할 수 있습니다.
위 코드는 onpromotion_flag, family_abbrev, onpromotion_ration, sales_onprom_target 총 4개의 새로운 컬럼을 추가합니다.
데이터프레임을 리턴하기 때문에 메서드 체이닝이 가능합니다.
마치며
이상으로 데이터프레임을 다루는 필터링, 정렬 등의 메서드에 대한 정리를 마치도록 하겠습니다.
Series와 Dataframe의 여러 메서드가 겹치기 때문에 함께 살펴보면 좋을 것 같습니다.
'파이썬・ML > pandas' 카테고리의 다른 글
판다스 카테고리 타입 데이터 커스텀 정렬하기 (0) | 2023.07.30 |
---|---|
판다스 데이터프레임 정리(1) 주요속성/메서드/조회 (0) | 2023.07.28 |
판다스 Series 정리(2) 인덱싱/필터링/정렬/연산/결측값 (0) | 2023.07.27 |
판다스 Series 정리(1) 특징/속성/생성법 (0) | 2023.07.27 |
판다스 데이터프레임과 피벗테이블 (0) | 2023.07.03 |