Pandas의 apply 함수를 사용하여 열을 여러 개의 새 열로 변환하는 방법
기본적인 예제
다음은 apply
함수를 사용하여 기존 열을 기반으로 두 개의 새 열을 만드는 간단한 예제입니다.
import pandas as pd
# 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
# 'A' 열을 제곱하고 'B' 열을 제곱근으로 변환하는 함수 정의
def transform_data(series):
return pd.Series({'A_squared': series['A'] ** 2, 'B_sqrt': series['B'] ** 0.5})
# 'apply' 함수를 사용하여 변환 함수 적용
df_new = df.apply(transform_data, axis=1)
# 결과 출력
print(df_new)
이 코드는 다음과 같은 출력을 생성합니다.
A_squared B_sqrt
0 1 3.0
1 4 3.162278
2 9 3.0
3 16 4.0
4 25 5.0
위 예제에서 transform_data
함수는 Series
객체를 입력으로 받고 두 개의 새 열을 반환하는 Series
객체를 출력합니다. apply
함수는 이 함수를 데이터 프레임의 각 행에 적용하여 새 열을 만듭니다.
여러 열에 함수 적용
apply
함수를 사용하여 여러 열에 함수를 적용할 수도 있습니다. 이를 위해서는 함수가 여러 개의 열을 입력으로 받고 여러 개의 열을 반환하도록 해야 합니다.
다음은 두 개의 열을 입력으로 받고 두 개의 새 열을 반환하는 함수를 사용하는 예제입니다.
import pandas as pd
# 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10], 'C': [11, 12, 13, 14, 15]})
# 두 개의 열을 입력으로 받고 두 개의 새 열을 반환하는 함수 정의
def transform_data(series):
return pd.Series({'A_minus_B': series['A'] - series['B'], 'B_divided_by_C': series['B'] / series['C']})
# 'apply' 함수를 사용하여 변환 함수 적용
df_new = df.apply(transform_data, axis=1)
# 결과 출력
print(df_new)
A_minus_B B_divided_by_C
0 -5 0.545455
1 -5 0.583333
2 -5 0.615385
3 -5 0.625
4 -5 0.666667
result_type
매개 변수 사용
apply
함수에는 result_type
매개 변수를 사용하여 새 열의 데이터 형식을 지정할 수 있습니다. 이 매개 변수는 다음과 같은 값을 허용합니다.
"expand"
: 각 결과 행을 새 열로 변환합니다."reduce"
: 결과를 단일 값으로 축소합니다."broadcast"
: 결과를 데이터 프레임의 형식에 맞게 브로드캐스트합니다.None
: 결과의 데이터 형식을 자동으로 추론합니다.
다음은 result_type
매개 변수를 사용하여 새 열의 데이터 형식을 지정하는 방법의 예입니다.
import pandas as pd
# 데이터 프레임 만들기
df = pd.DataFrame({'
예제 코드: pandas
함수를 사용하여 열을 여러 개의 새 열로 변환
예제 1: 기존 열을 제곱하고 제곱근 계산
이 예제에서는 apply
함수와 사용자 정의 함수를 사용하여 데이터 프레임의 두 열을 각각 제곱하고 제곱근을 계산하여 두 개의 새 열을 만듭니다.
import pandas as pd
# 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
# 'A' 열을 제곱하고 'B' 열을 제곱근으로 변환하는 함수 정의
def transform_data(series):
return pd.Series({'A_squared': series['A'] ** 2, 'B_sqrt': series['B'] ** 0.5})
# 'apply' 함수를 사용하여 변환 함수 적용
df_new = df.apply(transform_data, axis=1)
# 결과 출력
print(df_new)
설명:
import pandas as pd
행은pandas
라이브러리를 가져와pd
별칭으로 가져옵니다.df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
행은A
및B
라는 열을 가진pandas
데이터 프레임을 만듭니다. 각 열에는 5개의 값이 포함됩니다.def transform_data(series):
행은transform_data
라는 이름의 함수를 정의합니다. 이 함수는Series
객체를 입력으로 받고Series
객체를 출력합니다. 입력Series
객체는 데이터 프레임의 한 행을 나타냅니다.return pd.Series({'A_squared': series['A'] ** 2, 'B_sqrt': series['B'] ** 0.5})
행은A_squared
및B_sqrt
라는 두 개의 새 열을 포함하는Series
객체를 반환합니다. 새 열 값은 각각 해당 행의 'A' 열 값의 제곱과 'B' 열 값의 제곱근입니다.df_new = df.apply(transform_data, axis=1)
행은apply
함수를 사용하여transform_data
함수를 데이터 프레임의 각 행에 적용합니다.axis=1
매개 변수는 함수를 각 열에 적용하도록 지정합니다.print(df_new)
행은 결과 데이터 프레임을 출력합니다.
출력:
A_squared B_sqrt
0 1 3.0
1 4 3.162278
2 9 3.0
3 16 4.0
4 25 5.0
이 예제에서는 transform_data
함수를 직접 정의했지만, 람다 표현식을 사용하여 간결하게 작성할 수도 있습니다. 다음은 동일한 작업을 수행하는 람다 표현식을 사용하는 코드입니다.
df_new = df.apply(lambda x: pd.Series({'A_squared': x['A'] ** 2, 'B_sqrt': x['B'] ** 0.5}), axis=1)
예제 2: 여러 열을 사용하여 새 열 만들기
이 예제에서는 apply
함수와 사용자 정의 함수를 사용하여 데이터 프레임의 두 열을 사용하여 새 열을 만듭니다. 새 열은 두 입력 열의 차이와 몫을 계산합니다.
import pandas as pd
# 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10], 'C': [11, 12, 13, 14, 15]})
# 두 개의 열을 입력으로 받고 두 개의
pandas
의 apply
함수를 대체하는 방법
벡터화된 연산 사용:
만약 데이터 프레임의 열에 대해 벡터화된 연산을 수행할 경우, apply
함수보다 NumPy
함수를 사용하는 것이 더 빠를 수 있습니다. 예를 들어, 데이터 프레임의 모든 열에 제곱을 수행하려면 다음과 같이 할 수 있습니다.
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
# 'apply' 함수 사용
df_apply = df.apply(np.square, axis=1)
# NumPy 함수 사용
df_numpy = np.square(df)
# 결과 비교
print(df_apply)
print(df_numpy)
map 함수 사용:
map
함수는 apply
함수와 유사한 기능을 제공하지만, 람다 표현식과 함께 사용하기에 더 적합합니다. 예를 들어, 데이터 프레임의 열에 문자열 변환 함수를 적용하려면 다음과 같이 할 수 있습니다.
import pandas as pd
df = pd.DataFrame({'A': ['apple', 'banana', 'cherry'], 'B': ['dog', 'cat', 'mouse']})
# 'apply' 함수 사용
def to_upper(x):
return x.upper()
df_apply = df.apply(to_upper, axis=1)
# 'map' 함수 사용
df_map = df.apply(lambda x: x.upper(), axis=1)
# 결과 비교
print(df_apply)
print(df_map)
groupby 및 집계 함수 사용:
데이터 프레임을 그룹화하고 그룹별로 집계 연산을 수행하려는 경우 groupby
함수와 집계 함수를 사용하는 것이 더 효율적입니다. 예를 들어, 데이터 프레임을 'A' 열 기준으로 그룹화하고 각 그룹의 평균 'B' 값을 계산하려면 다음과 같이 할 수 있습니다.
import pandas as pd
df = pd.DataFrame({'A': [1, 1, 2, 2, 3], 'B': [6, 7, 2, 5, 1]})
# 'groupby' 및 집계 함수 사용
df_grouped = df.groupby('A')['B'].mean()
# 결과 출력
print(df_grouped)
리스트 추 comprehension 사용:
간단한 데이터 변환 작업을 수행하는 경우, 리스트 추 comprehension을 사용하는 것이 더 간결하고 효율적일 수 있습니다. 예를 들어, 데이터 프레임의 'A' 열을 제곱하고 'B' 열을 제곱근으로 변환하려면 다음과 같이 할 수 있습니다.
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
# 리스트 추 comprehension 사용
df_new = pd.DataFrame({'A_squared': [x**2 for x in df['A']], 'B_sqrt': [x**0.5 for x in df['B']]})
# 결과 출력
print(df_new)
직접적인 코드 작성:
특정 상황에서는 apply
함수보다 직접적인 코드를 작성하는 것이 더 효율적일 수 있습니다. 이는 특히 복잡한 로직이나 데이터 프레임의 특정 구조를 활용해야 하는 경우에 유용합니다.
python pandas merge