티스토리 뷰

목적: 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은 행축 (->)인 파란색 방향으로, axis=1은 열축인 노란색 방향으로 진행

 

axis=0(default)는 아래와 같이 행 방향→으로 데이터가 들어와서(하나의 열 전체가 들어옴) 함수를 적용하게 되고, 

axis=1는 아래와 같이 열 방향↓으로 데이터가 들어와서 (하나의 행 전체가 들어옴) 함수를 적용.

 

댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함