데이터 전 처리를 하다보면 DataFrame 을 내가 원하는 대로 조작해야 할 경우가 빈번히 발생한다. 여러가지 방법들이 있겠지만 이번 글에서는
apply()
함수와lambda
사용 법을 말하고자 한다
apply()
함수는DataFrame
과Series
두개 타입 모두에 적용할 수 있다
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
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
merged_df = pd.merge(df, df, on='idx', how='outer')
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
각 rows 에 있는 value_y 에 value_x 를 빼주는 간단한
function
이다
def get_time_diff(row):
value_y = row.value_y
value_x = row.value_x
return value_y - value_x
merged_df['time_diff'] = merged_df.apply(get_time_diff, axis=1)
merged_df
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
lambda
는 간단한function
을 간략하게 사용하기 좋다. 기능에 대한 코드가 길면function
으로 만드는 것을 추천한다. 기능적인 부분이 아닌 가독성 을 위해서이다. 아래 코드는 위에서def
로 만든 함수 대신lambda
로 사용한 예제이다
merged_df['time_diff']=merged_df.apply(lambda row : row.value_y-row.value_x, axis=1)
merged_df
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
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
DataFrame 이 display 되는 rows 가 가끔씩 답답할 때가 있다. 그래서
df.head(50)
할 때도 있고 그렇다. 하지만 display 되는 열의 개수를 custom 할 수도 있다. 아래 코드를 보자
pd.options.display.max_rows = len(merged_df)
merged_df