반응형
질문
가정해보자. df
라는 데이터프레임이 있고, 컬럼은 'ID', 'col_1', 'col_2'
이다. 그리고 다음과 같은 함수를 정의한다 :
f = lambda x, y : my_function_expression
.
이제 f
를 사용하여 df
의 두 개의 컬럼 'col_1', 'col_2'
에 적용하여 원소별로 새로운 컬럼 'col_3'
을 계산하고 싶다. 다음과 같이 :
df['col_3'] = df[['col_1','col_2']].apply(f)
# Pandas가 TypeError를 반환할 것이다: ('<lambda>() takes exactly 2 arguments (1 given)'
어떻게 해야 할까?
** 아래에 자세한 예시를 추가하였다 ***
import pandas as pd
df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']
def get_sublist(sta,end):
return mylist[sta:end+1]
#df['col_3'] = df[['col_1','col_2']].apply(get_sublist,axis=1)
# 위의 코드를 실행하면 다음과 같은 결과가 나와야 한다.
ID col_1 col_2 col_3
0 1 0 1 ['a', 'b']
1 2 2 4 ['c', 'd', 'e']
2 3 3 5 ['d', 'e', 'f']
답변
이 작업을 Pandas에서 깔끔하게 한 줄로 수행하는 방법이 있습니다:
df['col_3'] = df.apply(lambda x: f(x.col_1, x.col_2), axis=1)
이를 통해 f
는 여러 입력 값을 가진 사용자 정의 함수가 될 수 있으며, 열에 접근할 때 (안전한) 열 이름을 사용하므로 (위험한) 숫자 인덱스를 사용하지 않습니다.
데이터 예시 (원본 질문을 기반으로 함):
import pandas as pd
df = pd.DataFrame({'ID':['1', '2', '3'], 'col_1': [0, 2, 3], 'col_2':[1, 4, 5]})
mylist = ['a', 'b', 'c', 'd', 'e', 'f']
def get_sublist(sta,end):
return mylist[sta:end+1]
df['col_3'] = df.apply(lambda x: get_sublist(x.col_1, x.col_2), axis=1)
print(df)
의 출력:
ID col_1 col_2 col_3
0 1 0 1 [a, b]
1 2 2 4 [c, d, e]
2 3 3 5 [d, e, f]
열 이름에 공백이 포함되어 있거나 기존 데이터프레임 속성과 이름이 같은 경우, 대괄호를 사용하여 인덱싱할 수 있습니다:
df['col_3'] = df.apply(lambda x: f(x['col 1'], x['col 2']), axis=1)
반응형
댓글