one of a kind scene

[python] 데이터 프레임 column 끼리 연산하여 새로운 column 만들어주기(df.apply, lambda 활용) 본문

Python/데이터 핸들링

[python] 데이터 프레임 column 끼리 연산하여 새로운 column 만들어주기(df.apply, lambda 활용)

specialscene 2019. 12. 10. 23:19

(상황)

데이터 프레임이 아래와 같을때 column1과 column2의 코사인 유사도를 계산하려고 한다

 

(데이터)

df로 명명

idx column1 column2 column3
1 [1,0,1] [1,1,0]  

 

# cosin_similarity를 구하기 위한 라이브러리 import
from sklearn.metrics.pairwise import cosine_similarity

# cosine_similariy 계산해줄 수 있는 함수 cos_sim 정의
# 인자 a,b는 list형식으로 들어온다고 가정
# reshape은 계산 가능한 형태로 만들어주기 위해 해주는 것
def cos_sim(a,b):
    similarity = cosine_similarity(np.array(a).reshape(1,len(a)), np.array(b).reshape(1,len(a)))
    return similarity[0][0]

df['column3'] = df.apply(lambda x: cos_sim(x['column1'], x['column2']), axis=1)

(이렇게 이해하면 쉬웠음)

df.apply(lambda x: 어쩌구 저쩌구)를 써주면 for문 없이 row들이 순서대로 들어가

x로 받는다고 생각하면 이해하기 쉬웠음

 

 

(이렇게 해줄때 편한점)

예전에는 for문으로 코드를 억지로 만들어주는 느낌이 있었는데,

apply를 활용하면 좀 더 간결하게 column을 가지고 연산하여 새로운 column을 만들 수 있음

 

(이걸 몰랐을때 당황했던 경험)

1) cosine_similarity함수의 인자로는 np.array형태가 들어가는데

cosine_similarity(df['column1'], df['column2'])는 안되니깐 어떻게해야할지 몰랐음

 

2) for문으로 .iloc()을 이용해서 이상한 코드를 만들어서 썻었음