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) # 해당 인덱스를 제거함
이렇게 결과가 나옵니다.
첫 번째 줄 코드는 DF의 특정 기준을 만족하는 index를 idx라는 변수에 저장하고,
두 번째 줄 코드는 이러한 인덱스에 해당하는 (True로 표시가 되어있는)
row를 제거(drop) 해주는 역할을 수행합니다.
2) 더 간단한 방법
그런데,
역시 더 좋은 코드가 있었습니다.
DF = DF[DF.메뉴 != '돈까스']
저 한 줄로 제가 원하는 기능을 수행하더군요. ㅎㅎ
'DF.메뉴' 라는 코드를 통해 메뉴 열에 해당하는 Pandas Series를 선택하고,
그 중에 '돈까스'에 해당하지 않는 row만 DF에 새로 저장하는 방식으로,
제가 원하는 기능을 완벽히 구현했습니다.
접근은 비슷하지만, 두 번째 방법이 훨씬 fancy 해보이네요.
2. 더 다양한 조건 - 특정 값 이상의 행만 남기기
이와 같은 방식으로,
더 다양한 조건을 구현할 수 있습니다.
만약 9천원을 넘는 메뉴만 남기고 싶다면 어떻게 하면 될까요?
DF = DF[DF.가격 > 9000]
너무도 간단하게, 제가 원하는 작업을 수행했습니다.
p.s. 도움이 되었다면, 공감/댓글 부탁드립니다!
누군가에게 도움이 되었다는 것이 제게 소소한 기쁨이 됩니다.
잘못된 정보, 수정해야할 내용 지적은 언제든지 환영합니다!