Pandas 특정 값 삭제 - Pandas teugjeong gabs sagje

py

카테고리 없음

[파이썬 pandas] 특정 값이 들어간 행만을 골라서 행 전체 삭제하기

ML/DL Engineer&Researcher 2020. 12. 11. 13:25

파이썬으로 엑셀파일 중 열의 특정 값을 포함하는 행을 모두 삭제하는 방법

# pandas를 pd라는 약자로 import

import pandas as pd

#엑셀파일 열기

df = pd.read_excel("파일명.xlsx")

# mask에다가 어떤 칼럼명에 어떤 값을 갖고 있는 애들을 선택하게 한다.

mask = df['컬럼명'].isin(['특정값'])

# 그리고 마스크 영역을 제외한 영역을 볼 수 있다.

df[~mask].head() 

# 저장하려면 객체에 다시 저장

df1 = df[~mask]

예를들어 자동차명이 '레이' 인 것을 다 제외하고 삭제하고 싶으면

mask = df['자동차명'].isin(['레이'])

df1 = df[~mask]

라고 하면 df1에 df중에 레이가 포함된 행은 모두 삭제되고 나옴.

1) 조건을 만족하는 행의 index 뽑기

2) 해당 index의 행을 drop

ex)

1) idx = DF[DF['칼럼명'] == "내용"].index

DF.drop(idx , inplace=True)

2) DF = DF[DF.칼럼명 != '특정 값']

[출처] [파이썬] 7. 판다스 - 특정 조건 만족하는 행 삭제하기|작성자 러닝머신

과연 이걸 누가 볼까 싶지만,

판다스를 다루면서 '아, 이런 작업은 어떻게 처리하는게 좋을까?'

하고 생각했던,

자주 사용하지만 하나의 함수로 간단히 처리할 수 없는 작업에 대해서

해결하는대로 짧게 끊어서 올리려고 합니다.

제 방법이 가장 효율적이라고 할 수 없고,

더 간단한 방법이 있을 수 있지만

사용해 보았을 때 큰 문제 없는 코드를,

제 방식대로 풀어보려고 합니다.


1. 특정 값을 포함하는 행 제거하기

오늘 다뤄볼 작업은,

"( 데이터프레임에) 수 많은 행이 있는데,

이 행 중 특정 조건을 만족하는 행을 전부 삭제하고 싶다!"

할 때의 해결법입니다.

예를 들어 설명해 보겠습니다.

DF=pd.DataFrame({"메뉴":['간장게장','양념게장','돈까스','스윙스','피자','돈까스','라면','돈까스'], "가격":[10000,12000,7000,2000,11000,7000,5000,7000]})

이 코드의 결과물은 다음과 같습니다.

이 때,

메뉴가 "돈까스"인 행만 제거하고 싶다면,

어떻게 해야할까요?

얼핏 떠오르는 방법은 for loop를 사용하는 접근이지만,

이런 방법은 행의 갯수가 클 경우,

즉 수십만 행에 이를 경우 연산에 너무 많은 자원이 소비되는 것이 문제입니다.

for loop를 사용하는 방법을 제외하고,

두 가지의 접근을 택해보겠습니다.

사실 따지고 보면 다음과 같은 논리를 따릅니다.

1) 조건을 만족하는 행의 index 뽑기

                           ↓

2) 해당 index의 행을 drop

1) pd.drop을 사용하는 방법

먼저, 제가 떠올린 방법을 소개해드리겠습니다.

for 문으로 매번 if 조건을 확인하는 것 보다는,

조건을 만족하는 행의 index를 먼저 추출해 내고,

그 뒤 그 index만 drop 시켜주면 되지 않을까?

하는 접근에서 나온 코드입니다.

idx = DF[DF['메뉴'] == "돈까스"].index     # 메뉴 == 돈까스인 인덱스의 값이 저장됨
DF.drop(idx , inplace=True) # 해당 인덱스를 제거함


idx = DF[DF['메뉴'] == "돈까스"].index # 메뉴 == 돈까스인 인덱스의 값이 저장됨 DF.drop(idx , inplace=True) # 해당 인덱스를 제거함

이렇게 결과가 나옵니다.

첫 번째 줄 코드는 DF의 특정 기준을 만족하는 index를 idx라는 변수에 저장하고,

두 번째 줄 코드는 이러한 인덱스에 해당하는 (True로 표시가 되어있는)

row를 제거(drop) 해주는 역할을 수행합니다.

2) 더 간단한 방법

그런데,

역시 더 좋은 코드가 있었습니다.

DF = DF[DF.메뉴 != '돈까스']

저 한 줄로 제가 원하는 기능을 수행하더군요. ㅎㅎ

'DF.메뉴' 라는 코드를 통해 메뉴 열에 해당하는 Pandas Series를 선택하고,

그 중에 '돈까스'에 해당하지 않는 row만 DF에 새로 저장하는 방식으로,

제가 원하는 기능을 완벽히 구현했습니다.

접근은 비슷하지만, 두 번째 방법이 훨씬 fancy 해보이네요.



2. 더 다양한 조건 - 특정 값 이상의 행만 남기기

이와 같은 방식으로,

더 다양한 조건을 구현할 수 있습니다.

만약 9천원을 넘는 메뉴만 남기고 싶다면 어떻게 하면 될까요?

DF = DF[DF.가격 > 9000]

너무도 간단하게, 제가 원하는 작업을 수행했습니다.

p.s. 도움이 되었다면, 공감/댓글 부탁드립니다!

누군가에게 도움이 되었다는 것이 제게 소소한 기쁨이 됩니다.

잘못된 정보, 수정해야할 내용 지적은 언제든지 환영합니다!

[출처] [파이썬] 7. 판다스 - 특정 조건 만족하는 행 삭제하기|작성자 러닝머신

Toplist

최신 우편물

태그