[pandas] apply 함수와 lambda 사용법

Seongkeun·2023년 1월 24일
1

Python

목록 보기
4/8
post-thumbnail

개요

데이터 전 처리를 하다보면 DataFrame 을 내가 원하는 대로 조작해야 할 경우가 빈번히 발생한다. 여러가지 방법들이 있겠지만 이번 글에서는 apply() 함수와 lambda 사용 법을 말하고자 한다

사용법

apply() 함수는 DataFrameSeries 두개 타입 모두에 적용할 수 있다

기본 apply 사용 예제

setting

import pandas as pd

df=pd.DataFrame()

idx=['A','B','B','C','D','E','E','F','G','H','H','I','J','J']
place_id=[1,2,3,4,2,5,1,2,3,4,2,5,2,1]
value=[1.0,2.0,2.1,2.0,4.0,5.0,5.1,6.0,7.0,8.0,8.1,9.0,10.0,10.1]

df['idx']=idx
df['place_id']=place_id
df['value']=value

- output

	idx	place_id	value
0	A	1	    	1.0
1	B	2	    	2.0
2	B	3			2.1
3	C	4			2.0

...

10	H	2			8.1
11	I	5			9.0
12	J	2			10.0
13	J	1			10.1

merge dataframe

merged_df = pd.merge(df, df, on='idx', how='outer')

- output

	idx	place_id_x	value_x	place_id_y	value_y
0	A	1			1.0		1			1.0
1	B	2			2.0		2			2.0
2	B	2			2.0		3			2.1
3	B	3			2.1		2			2.0
4	B	3			2.1		3			2.1

...

18	J	2			10.0	2			10.0
19	J	2			10.0	1			10.1
20	J	1			10.1	2			10.0
21	J	1			10.1	1			10.1

function

각 rows 에 있는 value_yvalue_x 를 빼주는 간단한 function이다

def get_time_diff(row):
    value_y = row.value_y
    value_x = row.value_x
    return value_y - value_x

run the function with apply

merged_df['time_diff'] = merged_df.apply(get_time_diff, axis=1)
merged_df

- output

	idx	place_id_x	value_x	place_id_y	value_y	time_diff
0	A	1			1.0		1			1.0		0.0
1	B	2			2.0		2			2.0		0.0
2	B	2			2.0		3			2.1		0.1
3	B	3			2.1		2			2.0		-0.1
4	B	3			2.1		3			2.1		0.0

...

18	J	2			10.0	2			10.0	0.0
19	J	2			10.0	1			10.1	0.1
20	J	1			10.1	2			10.0	-0.1
21	J	1			10.1	1			10.1	0.0

apply with lambda

lambda 기본 사용 예제

lambda 는 간단한 function 을 간략하게 사용하기 좋다. 기능에 대한 코드가 길면 function 으로 만드는 것을 추천한다. 기능적인 부분이 아닌 가독성 을 위해서이다. 아래 코드는 위에서 def 로 만든 함수 대신 lambda 로 사용한 예제이다

merged_df['time_diff']=merged_df.apply(lambda row : row.value_y-row.value_x, axis=1)
merged_df

lambda 조금 더 심화 사용 예제

start_value=1.0
end_value=5.0

filtered_df = merged_df[merged_df.apply(lambda row: start_value <= row.value_y <= end_value, axis=1)]
filtered_df

- output

	idx	place_id_x	value_x	place_id_y	value_y	time_diff
0	A	1			1.0		1			1.0		0.0
1	B	2			2.0		2			2.0		0.0
2	B	2			2.0		3			2.1		0.1
3	B	3			2.1		2			2.0		-0.1
4	B	3			2.1		3			2.1		0.0
5	C	4			2.0		4			2.0		0.0
6	D	2			4.0		2			4.0		0.0
7	E	5			5.0		5			5.0		0.0
9	E	1			5.1		5			5.0		-0.1

번외

output 으로 print 되는 dataframe 열 개수 지정

DataFrame 이 display 되는 rows 가 가끔씩 답답할 때가 있다. 그래서 df.head(50) 할 때도 있고 그렇다. 하지만 display 되는 열의 개수를 custom 할 수도 있다. 아래 코드를 보자

pd.options.display.max_rows = len(merged_df)
merged_df
profile
지혜는 지식에서 비롯된다

0개의 댓글