본문 바로가기
Python/Python FAQ

Python 판다스 데이터프레임의 두 열에 함수를 적용하는 방법은 어떻게 되나요?, How to apply a function to two columns of Pandas dataframe

by 베타코드 2023. 7. 20.
반응형

질문


가정해보자. 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)
반응형

댓글