람다(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 객체의 모든 원소에 대해 함수를 적용할 수 있습니다. 이러한 메소드들은 판다스를 사용하여 데이터 전처리나 데이터 분석을 할 때 유용하게 사용될 수 있습니다.
'pandas' 카테고리의 다른 글
Pandas의 인덱싱과 슬라이싱: 데이터프레임에서의 원하는 값 추출하기 (0) | 2023.04.03 |
---|---|
복수열 조건문을 활용한 데이터프레임 필터링과 선택 (0) | 2023.03.27 |
Matplotlib으로 효과적인 데이터 시각화 방법 익히기 (2) | 2023.03.24 |
Seaborn을 활용한 데이터 시각화 - 깔끔하고 유용한 시각화 기법들 (0) | 2023.03.24 |
다양한 그래프 유형으로 살펴보는 데이터 시각화! (0) | 2023.03.23 |
댓글