프로그래밍 언어/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