반응형

03-01. 축 기준 (apply)


DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)

개요


apply 메서드는 DataFrame에 함수를 적용하여 반환하는 메서드 입니다.
함수에 전달되는 객체는 Seires형식이며 DataFrame의 index(axis=0)이냐 columns(axis=1)이냐에 따라 다릅니다.
최종반환 유형은 적용된 함수에 따라 정해지지만 result_type을 지정하여 변경이 가능합니다.

 

사용법


기본 사용법
df.apply(func, axis=0, raw=False, result_type=None, args=(), kwargs)
function : 각 행이나 열에 적용할 함수 입니다.
axis : {0 : Index / 1 : columns} 함수를 적용할 축 입니다.
row : {True : ndarray / False : Series} 함수에 전달할 축의 형식입니다.
True면 ndarray형태로 전달하고 False면 Series형태로 전달합니다. 기본적으로 Series입니다.
result_type : {expand / reduce / broadcast} 반환값의 형태를 결정합니다. expand이면 배열 형태를
기준으로 열을 확장합니다.(기본 인덱스로), reduce인 경우는 그대로 Serise형태로 반환합니다.
broadcase인 경우 기존 열 형식대로 확장하여 반환합니다.(열의 수가 같아야합니다.)

반응형

 

예시


먼저, 간단한 3x3 객체를 하나 생성하겠습니다.

col = ['col1','col2','col3']
row = ['row1','row2','row3']
data = [[1,2,3],[4,5,6],[7,8,9]]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
>>
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

func의 성질에 따른 차이
func항목이 np.sqrt처럼 축에대해 계산할 수 없는 형식이라면 아래와 같이 각 요소에 적용됩니다.

print(df.apply(np.sqrt))
>>
          col1      col2      col3
row1  1.000000  1.414214  1.732051
row2  2.000000  2.236068  2.449490
row3  2.645751  2.828427  3.000000

np.sum처럼 축에대해 적용이 가능한경우라면 축 기준으로 연산을 수행합니다.

print(df.apply(np.sum))
>>
col1    12
col2    15
col3    18
dtype: int64


axis에 따른 차이
axis가 0인경우 Index(행)에 대해 연산을 수행하고, 1인경우는 columns(열)에 대해 연산을 수행합니다.

print(df.apply(np.prod,axis=0))
>>
col1     28
col2     80
col3    162
dtype: int64
print(df.apply(np.prod,axis=1))
>>
row1      6
row2    120
row3    504
dtype: int64

 

result_type에 따른 차이
먼저 lamba를 사용하여 기존 DataFrame에 [1,2,3]객체를 apply해보겠습니다.

print(df.apply(lambda x : [1,2,3]))
>>
      col1  col2  col3
row1     1     1     1
row2     2     2     2
row3     3     3     3


result_type = 'expand'인 경우
func를 기준으로 확장하여 columns를 지정하게 되는것을 확인할 수 있습니다.

print(df.apply(lambda x : [1,2,3], axis=1,result_type='expand'))
>>
      0  1  2
row1  1  2  3
row2  1  2  3
row3  1  2  3


result_type = 'reduce'인 경우
func를 기준으로 축소하여 columns없이 Series 객체로 반환하는것을 확인할 수 있습니다.

print(df.apply(lambda x : [1,2,3], axis=1,result_type='reduce'))
>>
row1    [1, 2, 3]
row2    [1, 2, 3]
row3    [1, 2, 3]
dtype: object


result_type = 'broadcast'인 경우
func를 기준으로 확장하되, columns는 기존 DataFrame의 것을 사용하는것을 확인할 수 있습니다.

print(df.apply(lambda x : [1,2,3], axis=1,result_type='broadcast'))
>>
      col1  col2  col3
row1     1     2     3
row2     1     2     3
row3     1     2     3
반응형

+ 최근 글