프로그래밍 언어/Python

Pandas - 조건에 맞는 컬럼 값 여러개 바꾸기

DevPing9_ 2020. 12. 24. 10:14

컬럼값을 바꿀 때, for 문으로 바꾸려고 하시는분들이 꽤 계실 것이다.

필자 또한 처음에 for문으로 일일이 바꾸어주었는데, 다른 프로그래밍 언어라면 그렇게 하겠지만, 

파이썬은 진짜 웬만하면 다 만들어놓은게 많다.

(그리고 만들어진 라이브러리들은 C++같은 저레벨언어로 만들어졌기 때문에 실행시간이 훨씬 빠르다.)

 

판다스를 사용한다 -> 판다스 객체에서 무엇인가 하고싶다 -> 판다스에서 제공할 것이다

 

이러한 흐름대로 의식을 진행시킨다면, 저처럼 개고생하는 일은 없으실 것이다.

 


이 포스팅에서는, 아래의 내용을 다룰 것이다.

 

# Pandas 에서 조건에 맞는 컬럼에서 단일값 바꾸기

# Pandas 에서 조건에 맞는 컬럼에서 여러값 바꾸기

 

 


# Pandas 에서 조건에 맞는 컬럼에서 단일값 바꾸기

 

# 예시 데이터셋

 

dest_loc 컬럼에서 4행의 '대명동'을 '홍대'로 바꾸는 법은 아래와 같다.

 

## 예시 데이터셋 호출 
df = pd.read_csv("~~~~")

## 단일값 바꾸는 부분 

# 1. Index 기반 접근방법 
df.at[4,'dest_loc'] = '홍대'          # 4행, 'dest_loc'칼럼 값을 홍대로 변경

# 2. True/False 기반 접근 방법
df[(df['dest_loc'] == '대명동')] = '홍대'     # 'dest_loc'칼럼 中 '대명동'과 일치하는 데이터
                                              # '홍대'로 일괄변경(만족하는 값이 하나일경우 단일값 변경)
                                                    

 


# Pandas 에서 조건에 맞는 컬럼에서 여러값 바꾸기

 

# 예시 데이터셋

이번에는,

dest_loc과 boarding_loc에 괄호<(,)> 를 포함한 값을 모두

괄호안의 값으로 변경하는 법이다.

 

# 아래 코드는 추천하지 않는 형식의 코드(For문)이다

(제가 삽질했던 코드이다.. ㅠㅠㅠ)

 

240만건 기준 대충 10분(수행시간)은 걸렸던것 같다...

# 1. True/False 기반 For 문 접근 방법 (비추천)

# 주의 : 이런 짓 제발 하지말자
# 연산속도 엄청느림 + CopyWarning 발생 (되긴함)


df['dest_loc']=df['dest_loc'].fillna('None')

# cleaning dest_loc
idx= 0
for loc in df['dest_loc'] :
  if (loc.find('(') != -1) :
    clean_addr = loc.split('(')[1].replace(')',"")
    df['dest_loc'][idx]=clean_addr

  idx += 1

# 아래는 판다스에서 제공하는 apply 메소드를 이용한 매우 강추하는 방법이다

(연산속도가 말도안되게 빠르다...)

 

240만건 기준 1분(수행속도)도 안걸린것 같다... ㅠㅠ

 

공백까지 지우려면 위의 방법으로는 연산속도가 더 증가하게되는데,

apply로 아주 간단히... 가능하다 ㅠㅠ

# 2. Pandas apply 메소드 기반 접근방법 (강추!)

# 연산속도 엄청빠름

def cleaning(x) :
  if str(x).find("(") != -1 :
    return str(x).split("(")[1].replace(")","") 
  return str(x)


# apply메소드의 lambda 함수는 공백까지 지우기 위해 사용한 코드입니다.
# 이렇게 중복으로도  사용가능하다는걸 알려드리고 싶었네요 ㅎ.ㅎ

# boarding_loc cleaning
df['boarding_loc']=df['boarding_loc'].fillna("NONE")
df['boarding_loc']=df['boarding_loc'].apply(cleaning).apply(lambda x:x.replace(" ",""))

# dest_loc cleaning
df['dest_loc']=df['dest_loc'].fillna("NONE")
df['dest_loc']=df['dest_loc'].apply(cleaning).apply(lambda x:x.replace(" ",""))

 

 

 

 

 

 

 

728x90