데이터 분석 작업을 하다 보면 DataFrame의 모든 행에 동일한 연산이나 함수를 일괄 적용해야 하는 경우가 자주 발생합니다. 판다스(Pandas)에서는 apply() 메서드를 활용하면 이러한 작업을 간단하게 처리할 수 있습니다. 이 글에서는 람다(lambda) 함수를 사용하는 방법과 사용자 정의 함수를 적용하는 방법, 두 가지 방식을 예제와 함께 살펴보겠습니다.
방법 1: 람다(lambda) 함수를 각 행에 적용하기
가장 간결한 방법은 apply() 메서드에 람다 함수를 전달하고, axis=1 옵션을 지정하여 각 행 단위로 연산을 수행하는 것입니다.
예제 코드
import pandas as pd
df = pd.DataFrame([(10, 3, 13), (0, 42, 11), (26, 52, 1)], columns=list('xyz'))
print("기존 데이터프레임")
print(df)
NewMatrix = df.apply(lambda a: a + 10, axis=1)
print("변경된 데이터프레임")
print(NewMatrix)
실행 결과:
기존 데이터프레임
x y z
0 10 3 13
1 0 42 11
2 26 52 1
변경된 데이터프레임
x y z
0 20 13 23
1 10 52 21
2 36 62 11
위 코드에서는 람다 함수 lambda a: a + 10을 통해 각 행의 모든 값에 10을 더했습니다. axis=1은 열(column)이 아닌 행(row) 방향으로 함수를 적용하겠다는 의미입니다.
방법 2: 사용자 정의 함수(User Defined Function) 적용하기
복잡한 로직이 필요한 경우에는 직접 정의한 함수를 apply()에 전달할 수 있습니다. 아래 예제는 각 값의 제곱을 계산하는 함수를 모든 행에 적용합니다.
예제 코드
import pandas as pd
def SquareData(x):
return x * x
df = pd.DataFrame([(10, 3, 13), (0, 42, 11), (26, 52, 1)], columns=list('xyz'))
print("기존 데이터프레임")
print(df)
NewMatrix = df.apply(SquareData, axis=1)
print("변경된 데이터프레임")
print(NewMatrix)
실행 결과:
기존 데이터프레임
x y z
0 10 3 13
1 0 42 11
2 26 52 1
변경된 데이터프레임
x y z
0 100 9 169
1 0 1764 121
2 676 2704 1
사용자 정의 함수 SquareData는 입력받은 값을 제곱하여 반환합니다. apply() 메서드에 이 함수를 전달하면 DataFrame의 각 요소에 제곱 연산이 수행됩니다.
정리
df.apply(함수, axis=1): 행(row) 단위로 함수를 적용합니다.axis=0(기본값): 열(column) 단위로 함수를 적용합니다.- 간단한 연산은 람다 함수로, 복잡한 로직은 사용자 정의 함수로 처리하는 것이 좋습니다.
apply() 메서드를 잘 활용하면 반복문 없이도 벡터화된 방식으로 데이터를 효율적으로 가공할 수 있어 코드의 가독성과 성능이 모두 향상됩니다.