티스토리 뷰
목적: python을 이용해 특정 구분자로 구분 되어 있는 문자열에서 제일 마지막 값만 없애기.
import pandas as pd
df = pd.DataFrame({'cat':['건>강', '디>지>털', '화>장>품']})
# df['cat'] = df['cat'].apply(lambda x: ">".join(x.split(">")[:-1]))
Before | After |
|
참고로 샘플 데이터를 저렇게 만들어서 그렇지 실제로는
'건강>건강관리>마스크',
'디지털>휴대폰액세서리>휴대폰케이스>기타케이스',
'화장품>스킨케어>크림' 이런식으로 되어 있는 데이터였음.
본인의 데이터가 샘플 데이터처럼 생겼고, 저 상황에서 맨 마지막 두 글자만 떼고 싶으면 '화>장>품'[:-2] 이렇게 하면 됨.
Data Frame에 적용하기 전에 하나의 문자열 ('화>장>품')에 대한 코드 작성.
Step 1
먼저 split을 이용해 구분자인 '>'를 기준으로 문자열을 쪼개 리스트를 만듦
'화>장>품'.split(">")
Step 2
마지막 원소는 제외하고 선택
'화>장>품'.split(">")[:-1]
Step 3
join을 이용해 리스트를 문자열로 합침. 이 때 구분자를 기존 구분자인 ">" 사용
">".join('화>장>품'.split(">")[:-1])
Step 4
하나의 문자열에 적용하는 방법을 알았으니 이제 데이터프레임에 적용할 차례.
위에서 만든 기능을 하는 함수를 정의함. 함수 이름은 delete_tail.
그리고 data frame 의 'cat'컬럼에 delete_tail 함수를 적용함.
def delete_tail(x):
x = ">".join(x.split(">")[:-1])
return x
df['cat'] = df['cat'].apply(delete_tail)
성공!
Bonus
아래와 같이 lambda 함수를 적용해 코드를 간단하게 만들 수도 있음.
data frame에 lambda를 적용하는 법은 df['컬럼명'].apply(lambda 입력값: 결과값(수식이나 함수))
axis=1의 의미는 열 방향으로 수식이나 함수를 적용한다. 반환되는 값은 df의 행의 숫자와 동일.
df['cat'] = df['cat'].apply(lambda x: ">".join(x.split(">")[:-1]))
# df['cat'] = df.apply(lambda x: ">".join(x['cat'].split(">")[:-1]), axis=1) # 동일
참고로 아래와 같이 apply할 때 axis=1을 사용해 df 전체에 대해 apply적용하고 delete_tail 함수 안에서 'cat'이라는 컬럼만 선택해 줄 수 있음. 지금 케이스에서는 굳이? 싶지만 알아두면 유용! (예시: 영업일(bdate_range, is_busday, weekmask))
def delete_tail(x):
x = ">".join(x['cat'].split(">")[:-1])
return x
df['cat'] = df.apply(delete_tail, axis=1)
df
맨날 헷갈리는 axis 정리
axis=0이 행축→(파란색), axis=1이 열축↓(노란색).
axis=0은 행축(-----→)으로 수식을 적용하기에 결과적으로 열 개수만큼 결과가 반환됨.
axis=0(default)는 아래와 같이 행 방향→으로 데이터가 들어와서(하나의 열 전체가 들어옴) 함수를 적용하게 되고,
axis=1는 아래와 같이 열 방향↓으로 데이터가 들어와서 (하나의 행 전체가 들어옴) 함수를 적용.
'pandas' 카테고리의 다른 글
건강보험심사평가원_의약품사용정보조회서비스_약효분류군별 지역별 사용량 목록조회 (0) | 2023.04.06 |
---|---|
pd.read_xml을 사용해 xml파일을 dataframe으로 바꾸기 (0) | 2023.04.02 |
영업일(bdate_range, is_busday, weekmask) (0) | 2022.07.15 |
pd.to_datetime, strptime, strftime, (0) | 2022.07.15 |
group by 후 custom된 집계함수 사용 (0) | 2022.06.16 |
- Total
- Today
- Yesterday