본문 바로가기
  • CobsLab upgrades your company value by AI technology
pandas

람다(lambda) 함수와 함께하는 판다스(Pandas) apply() 메소드 활용법

by dmkdmk 2023. 3. 27.


람다(lambda) 함수란?

람다(lambda) 함수는 파이썬(Python)에서 사용할 수 있는 익명(anonymous) 함수입니다. 람다 함수는 함수를 한 줄로 간결하게 작성할 수 있어서 코드의 가독성을 높일 수 있습니다. 람다 함수는 lambda 키워드를 사용하여 정의합니다.

lambda arguments: expression


arguments는 람다 함수의 입력 인수를 나타내며, expression은 람다 함수의 출력값을 나타냅니다. 

square = lambda x: x**2


위 람다 함수는 입력값을 제곱하는 연산을 수행해줍니다.


apply() 메소드와 람다(lambda) 함수의 활용 예시

이제 apply() 메소드와 람다 함수를 함께 사용하는 예시 코드를 살펴보겠습니다.

df = pd.DataFrame({
    'column_1': [1, 2, 3],
    'column_2': [4, 5, 6]
})

result = df.apply(lambda row: row['column_1'] + row['column_2'], axis=1)


위 코드에서는 람다(lambda) 함수를 사용하여 데이터프레임의 행(row)에 대해 연산을 수행합니다.

apply() 메소드의 인수로 lambda 함수를 전달하는 방식으로 사용됩니다. 위 코드에서는 람다 함수를 사용하여 'column_1'과 'column_2' 열(column)의 값을 더하는 연산을 수행합니다.

axis=1을 지정하여 행(row) 방향으로 apply() 메소드를 적용합니다. 결과값으로는 데이터프레임의 행(row)에 대해 연산을 수행한 결과가 시리즈(Series) 형태로 반환됩니다.

또한, apply() 메소드를 사용하여 데이터프레임의 열(column)에 대해 연산을 수행할 수도 있습니다. 

df = pd.DataFrame({
    'column_1': [1, 2, 3],
    'column_2': [4, 5, 6]
})

result = df.apply(lambda col: col.max() - col.min())


위 코드에서는 람다(lambda) 함수를 사용하여 데이터프레임의 열(column)에 대해 연산을 수행했습니다. apply() 메소드를 사용하여 데이터프레임의 열(column)에 대해 max()와 min() 함수를 적용하여 각 열(column)에 대한 최댓값과 최솟값의 차이를 구합니다.

axis 인수를 생략한 경우, apply() 메소드는 디폴트로 열(column) 방향으로 적용됩니다.

 

 

 

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
print(df)

>>>


   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

apply 메소드 설명할때 필요한 예제로 A', 'B', 'C'  3개의 열(column) 3개의 행으로을 가진 데이터프레임을 생성했습니다.



apply() 메소드 기본 사용법

 apply 메소드를 사용해 각 열(column)에 대해 함수를 적용할 수 있습니다. 각 열의 합계를 구하려면 다음과 같이 lambda 함수를 사용합니다.

df.apply(lambda x: x.sum())

>>>

A     6
B    15
C    24
dtype: int64


apply 메소드는 각 열(column)에 대해 함수를 적용하고, 결과를 시리즈(Series) 형태로 반환합니다. 따라서 위 코드에서는 각 열의 합계를 구한 결과가 출력됩니다.

 


apply() 메소드에 함수 적용하기

apply 메소드에 적용되는 함수는 lambda 함수뿐만 아니라 일반적인 함수(function)도 가능합니다. 이번에는 각 열(column)의 최솟값과 최댓값을 구하는 함수를 정의해 apply 메소드에 적용해 보겠습니다.

def min_max(x):
    return pd.Series([x.min(), x.max()], index=['min', 'max'])

df.apply(min_max)

>>>

     A  B  C
min  1  4  7
max  3  6  9

 

위 코드에서는 min_max 함수를 정의하고, apply 메소드에 인수로 전달합니다. min_max 함수는 각 열(column)에 대해 최솟값(min)과 최댓값(max)을 구하고, 결과를 시리즈(Series) 형태로 반환합니다. 따라서 위 코드에서는 각 열의 최솟값과 최댓값을 구한 결과가 출력됩니다.


apply() 메소드에 인수 전달하기

apply 메소드에 인수(argument)를 전달하려면 apply 메소드의 args 인수를 사용합니다.

def my_func(x, a, b):
    return a*x + b


위 함수는 입력값 x, 상수값 a, b를 받아서 a*x + b를 계산하는 함수입니다. 이 함수를 apply 메소드에 적용하려면 args 인수를 사용해 a, b 값을 전달해야 합니다.

df['A'].apply(my_func, args=(2, 3))


위 코드를 실행하면 df의 'A'열(column)에 my_func 함수를 적용한 결과가 출력됩니다. args 인수에는 2와 3이 전달되어 상수값 a=2, b=3으로 설정되고, 'A'열의 각 요소에 대해 my_func 함수가 적용됩니다.


apply() 메소드에 인수와 키워드 인수 전달하기

apply 메소드에 인수와 키워드 인수(keyword argument)를 함께 전달하려면 apply 메소드의 args와 kwargs 인수를 함께 사용합니다. 


def my_func2(x, a=1, b=0):
    return a*x + b

 

입력값 x와 상수값 a, b를 받아서 a*x + b를 계산하는 함수입니다. 이 함수를 apply 메소드에 적용하려면 args와 kwargs 인수를 함께 사용해 a, b 값을 전달해야 합니다.


df['B'].apply(my_func2, args=(), kwargs={'a': 2, 'b': 3})


df의 'B'열(column)에 my_func2 함수를 적용한 결과가 출력됩니다. kwargs 인수에는 a=2, b=3이 전달되어 상수값 a=2, b=3으로 설정되고, 'B'열의 각 요소에 대해 my_func2 함수가 적용됩니다.

 

apply() 메소드와 axis 인수

apply 메소드는 기본적으로 행(row) 방향으로 함수를 적용합니다. 즉, apply 메소드를 DataFrame 객체에 적용하면 각 행에 함수가 적용됩니다. 그러나 apply 메소드에 axis 인수를 전달하여 열(column) 방향으로 함수를 적용할 수도 있습니다. axis 인수에는 0 또는 1을 전달할 수 있으며, 기본값은 0입니다.




data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'gender': ['F', 'M', 'M']
}

df = pd.DataFrame(data)


세 명의 사람에 대한 이름(name), 나이(age), 성별(gender) 정보를 갖는 DataFrame 객체를 생성했습니다.

이제 apply 메소드를 사용하여 각 열의 데이터 타입을 확인해 보겠습니다.

df.apply(lambda x: x.dtype)

>>>
name      object
age        int64
gender    object
dtype: object

각 열의 데이터 타입(dtype)이 출력됐니다. 이때, apply 메소드는 기본적으로 행(row) 방향으로 함수를 적용하므로, 각 행에 대해 x.dtype이 계산됩니다.

 

 


이제 axis 인수에 1을 전달하여 각 행의 데이터 타입을 확인해 보겠습니다.

df.apply(lambda x: x.dtype, axis=1)


>>>
0    object
1    object
2    object
dtype: object

위 코드를 실행하면 각 행의 데이터 타입(dtype)이 출력됩니다. 이때, apply 메소드는 axis=1 인수를 전달하였으므로, 각 열에 대해 x.dtype이 계산됩니다.


applymap() 메소드

apply 메소드는 DataFrame 객체의 각 열 또는 각 행에 대해 함수를 적용할 수 있습니다. 그러나 DataFrame 객체의 모든 원소에 대해 함수를 적용하려면 applymap 메소드를 사용해야 합니다.



위 코드는 세 개의 열(A, B, C)과 세 개의 행(1, 2, 3)으로 이루어진 DataFrame 객체를 생성합니다.

이제 applymap 메소드를 사용하여 각 원소에 대해 제곱을 계산해 보겠습니다.

data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}

df = pd.DataFrame(data)

df.applymap(lambda x: x ** 2)

>>>

   A   B   C
0  1  16  49
1  4  25  64
2  9  36  81


DataFrame 객체의 모든 원소에 대해 제곱이 계산되었습니다.


Conclusion

판다스 apply 메소드는 DataFrame 객체의 각 열 또는 각 행에 대해 함수를 적용할 수 있는 유용한 메소드입니다. 또한, apply 메소드를 사용하여 axis 인수를 전달하면 열(column) 방향으로 함수를 적용할 수도 있습니다. applymap 메소드는 DataFrame 객체의 모든 원소에 대해 함수를 적용할 수 있습니다. 이러한 메소드들은 판다스를 사용하여 데이터 전처리나 데이터 분석을 할 때 유용하게 사용될 수 있습니다.

댓글