판다스의 transform 함수
transform 함수란?
판다스의 transform 함수는 데이터 프레임의 각 열에 여러 개의 함수를 동시에 적용하고, 그 결과를 동일한 행의 데이터로 반환하는 데 사용됩니다. 이 함수는 여러 열에 여러 함수를 동시에 적용해야 할 때 매우 유용하지만, 몇 가지 제한 사항도 존재합니다.
예시와 함께 설명을 제공하는 것이 이해를 돕는 데 효과적이므로, 우선 가상의 주가 데이터인 간단한 예시 데이터 프레임을 생성해 보겠습니다. df는 2024년 10월 21일부터 4일 동안 가상의 삼성전자와 카카오의 주식 데이터입니다.
import pandas as pd
pd.options.display.float_format = '{:.3f}'.format # 소수점 셋째 자리 출력
# 날짜 생성
dates = pd.date_range(start="2024-10-21", periods=4, freq='D')
# 주가 데이터 생성(가상)
data = {'Samsung': [61900, 61900, 61400, 63900],
'Kakao': [53200, 56500, 50900, 55700]}
# 데이터 프레임 생성
df = pd.DataFrame(data, index=dates)
df
생성한 df를 기반으로 transform 함수의 장점을 보여 드리겠습니다.
transform 함수로 여러 함수 적용하기
transform 함수를 사용하는 이유는 여러 함수를 동시에 적용할 수 있다는 점입니다. 예를 들어, 주가 데이터에 대해 diff와 pct_change 함수를 동시에 적용할 수 있습니다. 판다스의 diff 함수는 각 행과 이전 행의 차이를 계산하는 함수로, 주가 데이터를 분석할 때 가격 변동을 확인하는 데 유용합니다. pct_change 함수는 이전 행과의 백분율 변동을 계산하여 변동률을 측정합니다.
# diff 함수와 pct_change 함수를 동시에 모든 열에 적용
out = df.transform(['diff', 'pct_change'])
transform 함수를 이용해 모든 열에 두 가지 함수를 한 번에 적용할 수 있습니다. 중요한 점은, transform 함수에 입력되는 함수는 입력 크기와 동일한 크기의 결과를 반환해야 한다는 것입니다. diff와 pct_change는 시리즈를 전달하면 결과도 동일한 크기의 시리즈를 반환하기 때문에, 문제없이 사용할 수 있습니다.
집계 함수(예: mean, sum)는 시리즈를 전달했을 때 단일 값을 반환하므로, transform에서는 사용할 수 없습니다. 집계 함수들은 시리즈를 단일 값으로 반환하므로, transform이 요구하는 동일한 크기의 결과를 반환해야 한다는 조건을 만족하지 않기 때문입니다.
사용자 정의 함수를 활용한 transform
차이와 변동률 외에 기존의 주가 데이터도 함께 포함하는 것이 분석에 유용할 수 있습니다. 이는 transform 함수가 사용자 정의 함수도 지원하기 때문에 가능합니다. 다만, 이때 사용자 정의 함수 역시 동일한 크기의 결과를 반환해야 합니다.
일반적으로 transform에 입력될 사용자 정의 함수는 lambda 함수보다는 def로 정의하는 것이 유용합니다. 그 이유는 lambda 함수로 생성한 열은 열의 이름이 <lambda>가 되며, transform 함수에 여러 개의 lambda 함수를 동시에 입력할 수도 없기 때문입니다. (사용자 정의 함수는 따옴표로 입력할 수 없다는 점은 주의하세요.)
# 사용자 정의 함수 정의
def price(s):
return s
# 사용자 정의 함수 price와 기존의 diff, pct_change 동시에 적용
out = df.transform([price, 'diff', 'pct_change'])
위에서 정의한 price 함수는 데이터를 그대로 반환하는 함수입니다. 주가를 price 함수에 적용하면 주가를 그대로 반환합니다. 이처럼 transform 함수에 여러 함수를 동시에 적용할 때, def로 정의된 함수의 이름이 새로운 열의 이름으로 지정되기 때문에 함수의 역할을 쉽게 파악할 수 있습니다.
groupby와 함께 사용하는 transform
transform 함수는 꽤나 편리하지만, 실제로는 생각보다 자주 사용되지 않습니다. 그 이유는 판다스의 주요 목적이 원시 데이터(raw data)를 처리하는 것이며, 원시 데이터는 모든 열에 동시에 여러 함수를 적용해야 하는 상황이 그리 흔하지 않기 때문입니다. (예시의 df는 원시 데이터가 아니라, 날짜와 종목으로 피벗된 데이터입니다.)
원시 데이터에는 groupby와 함께 사용하는 transform이 더 자주 활용되는 경우가 많습니다. 단, groupby와 transform을 함께 사용할 때, transform이 다르게 동작합니다. 비록 이름은 동일하지만, 메서드는 객체에 종속되며, 데이터 프레임 객체와 그룹바이 객체는 서로 다르기 때문에 동일한 이름의 메서드도 각각 다르게 정의될 수 있습니다.
groupby와 transform 함수를 함께 사용할 경우, 여러 함수를 리스트로 묶어 한 번에 적용할 수 없다는 제한이 있습니다.
# groupby + transfom에서 여러 함수를 리스트로 묶으면 에러가 발생한다.
df.groupby('Samsung')['Kakao'].transform(['diff', 'pct_change'])
TypeError: unhashable type: 'list'
아래 링크를 확인하시면 해당 에러를 더 자세히 공부하실 수 있습니다.
https://kimpanda.tistory.com/289
결론
transform 함수는 동일 크기의 결과를 반환하는 여러 함수를 각 열에 동시에 적용할 수 있는 매우 유용한 기능입니다. 그러나 피벗된 데이터를 자주 사용하지 않는 경우, 이 함수의 활용도가 낮을 수 있습니다. 원시 데이터를 다루는 경우 groupby와 함께 사용하는 transform은 데이터를 그룹화한 후 특정 작업을 수행하는 데 더 적합한 경우가 많습니다.(엄밀하게 구분하면 객체가 다르니 별개의 함수입니다.)
일반적으로 판다스 입문자들은 groupby와 transform 함수의 조합을 공부한 후, transform 함수에 대해 더 궁금해하게 됩니다. 이 글은 그러한 궁금증을 해소하기 위해 작성된 것으로, 앞서 설명한 내용을 숙지하시면 groupby와 transform 함수를 사용할 때도 도움이 될 것입니다.
groupby + transform 활용은 아래 링크를 확인하세요.
https://kimpanda.tistory.com/250
교보문고 구매 페이지, 알라딘 구매 페이지, yes24 구매 페이지
'판다스 > 중급 판다스' 카테고리의 다른 글
[pandas] replace 함수와 map 함수의 차이점 (3) | 2024.10.24 |
---|---|
[pandas] agg 함수 개념 정립 (0) | 2024.10.20 |
[pandas] 두 데이터 프레임에 공통으로 존재하는 행 추출하기 (0) | 2024.10.16 |
[pandas] period 자료형의 장점 (0) | 2024.10.16 |
[pandas] 특정 열의 값을 기준으로 행을 선택하는 방법 (0) | 2024.05.22 |