HOWTO · Pandas
Pandas DataFrame의 모든 행에 함수 적용
이 자습서에서는 DataFrame의 모든 행에 Pandas 적용 기능을 사용하는 방법과 각 행에 람다, numpy 및 사용자 정의 함수를 사용하는 것과 같이 다른 함수를 인수로 적용하는 방법을 보여줍니다.
이 페이지의 내용
axis=1을 지정해 DataFrame.apply()에 각 행을 전달하면 호출 가능한 객체가 행마다 실행됩니다. 반환된 변환 결과는 apply()가 DataFrame으로 모읍니다. 이 가이드에서는 행 방향을 지정하는 방법과 lambda, NumPy 함수, 추가 인수가 있거나 없는 사용자 정의 함수를 살펴봅니다.
Pandas apply() 함수의 기본 구문
일반적인 형식은 dataframe.apply(function, axis=1, args=())입니다. 호출 가능한 객체가 각 행을 받도록 하려면 axis=1을 지정합니다. 기본값은 axis=0이며, 이때는 각 열이 전달됩니다. 행 단위로 호출하면 함수는 열 이름을 인덱스로 갖는 Series를 받으며, 반환값에 따라 결과 형식이 결정됩니다. 각 행에서 스칼라를 반환하면 Series가 되고, 레이블이 일관된 Series를 반환하면 DataFrame이 됩니다.
args에는 행 다음에 전달할 추가 위치 인수를 넣습니다. 모든 행에 공통으로 사용할 값을 사용자 정의 함수에 전달할 때 유용합니다. 전체 매개변수 설명은 DataFrame.apply()를 참고하세요.
Pandas DataFrame의 각 행에 lambda 함수 적용
짧은 변환에는 lambda를 사용하면 편리합니다. 다음 예제는 각 행의 모든 값에 10을 더하고 열 구성이 같은 DataFrame을 반환합니다. 로직이 더 길다면 이름이 있는 함수를 정의하는 편이 읽고 재사용하기 쉽습니다.
다음 예제를 실행합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
dataframe = pd.DataFrame([(1, 34, 23), (11, 31, 11)], columns=list("ABC"))
result = dataframe.apply(lambda row: row + 10, axis=1)
print(result)
A B C
0 11 44 33
1 21 41 21
Pandas DataFrame의 각 행에 NumPy 함수 적용
행의 각 값에 적용되는 NumPy 호출 가능 객체는 그대로 전달할 수 있습니다. 여기서는 np.sqrt가 각 숫자형 셀을 변환하고 apply()가 변환된 행을 모읍니다. 제곱근은 음수가 아닌 숫자 값에 적합합니다. 데이터에 다른 형식이 있거나 도메인에 따른 조건이 있다면 그에 맞는 연산을 선택하세요.
다음 예제를 실행합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import numpy as np
import pandas as pd
dataframe = pd.DataFrame([(4, 9, 16), (25, 36, 49)], columns=list("ABC"))
result = dataframe.apply(np.sqrt, axis=1)
print(result)
A B C
0 2.0 3.0 4.0
1 5.0 6.0 7.0
인수를 사용해 Pandas DataFrame의 각 행에 사용자 정의 함수 적용
짧은 표현식만으로 처리하기 어려운 변환은 함수로 정의하세요. 이 예제에서는 row가 첫 번째 인수이고, args를 통해 그 뒤에 2를 전달해 각 값을 두 배로 만듭니다. args는 위치 인수 튜플이어야 하므로 추가 인수가 하나라면 (2,)로 씁니다.
다음 예제를 실행합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
def multiply_row(row, factor):
return row * factor
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_row, axis=1, args=(2,))
print(result)
A B C
0 4 6 8
1 6 10 20
인수 없이 Pandas DataFrame의 각 행에 사용자 정의 함수 적용
모든 행에 공통으로 전달할 매개변수가 필요하지 않다면 행 매개변수만 받는 함수를 정의해 그대로 전달하세요. 이 예제는 각 행의 값을 4배로 만듭니다. 반환된 행의 레이블이 유지되므로 결과는 원래 열을 가진 DataFrame입니다.
다음 예제를 실행합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
def multiply_by_four(row):
return row * 4
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_by_four, axis=1)
print(result)
A B C
0 8 12 16
1 12 20 40
apply()는 전체 행을 받아 처리하는 호출 가능 객체가 필요한 경우에 사용하세요. 단순한 열 단위 산술 변환이라면 벡터화된 표현식을 직접 쓰는 편이 더 명확하고 행마다 Python을 호출하는 비용도 줄일 수 있습니다.