2 분 소요

eval 함수를 이용한 data frame 연산


eval 함수란


eval 함수는 여러 프로그래밍 언어에 존재하는 함수이다.
문자열을 입력 받아 그 문자열을 식으로 해석하여 결과를 반환하는 함수이다.


예를 들어 A= “2+2” 라는 문자열 변수가 있을 때 eval(A) 는 문자열 안의 식을 계산하여 4를 반환한다.


주의할 점


eval 함수의 주의할 점은 caller의 권한으로 수행하는 함수이기 때문에 치명적인 보안 위험이 존재한다.
일반적인 프로그래밍에선 아예 사용하지 않는 것을 권고한다.
우스개 소리로 eval is evil 이라는 말도 있다.


하지만 pandas 의 dataframe 연산에서는 꽤나 편한 기능을 제공하니 한번 사용해보자.

dataframe 에서의 사용

우선 실습에 필요한 데이터를 만들어보자.

import pandas as pd

list1 = [70,80,90,60]
list2 = [50,45,85,75]
list3 = [65,70,45,95]

df = pd.DataFrame({'국어': list1, '영어':list2 , '수학': list3})
df['이름'] = ['윤정호','아이유','슬기','윈터']
df
국어 영어 수학 이름
0 70 50 65 윤정호
1 80 45 70 아이유
2 90 85 45 슬기
3 60 75 95 윈터

수치 연산

간단한 성적 데이터프레임을 만들어봤다.
우선 각 성적의 총점을 구해보자

df.eval("국어+영어+수학")
0    185
1    195
2    220
3    230
dtype: int64

결과를 통해 알 수 있듯이 eval 함수는 수치 연산시 series 형태로 결과를 반환한다.
그리고 이 결과는 바로 새로운 열로 추가 가능하다.

기존 데이터프레임 새로운 열에 결과 값 추가

df.eval("총점=국어+영어+수학", inplace=True)
df
국어 영어 수학 이름 총점
0 70 50 65 윤정호 185
1 80 45 70 아이유 195
2 90 85 45 슬기 220
3 60 75 95 윈터 230
import numpy as np

df.eval("평균 = 총점 / 3", inplace=True)
df['평균']= np.round(df['평균'].values,2)

df
국어 영어 수학 이름 총점 평균
0 70 50 65 윤정호 185 61.67
1 80 45 70 아이유 195 65.00
2 90 85 45 슬기 220 73.33
3 60 75 95 윈터 230 76.67

아주 간단하게 연산과 열 추가를 할 수 있다.

inplace 는 값이 true 일 경우 원본 데이터를 변경하고 false 일 경우 적용된 결과 값만을 반환한다.


논리 연산

eval 함수를 통해 논리 연산도 가능하다.

df.eval("평균>70")
0    False
1    False
2     True
3     True
dtype: bool

논리 연산 수행시 boolean 의 값을 가지는 series 형태로 결과를 반환한다.


그리고 이 값을 이용해 loc[bool, 칼럼명] = ‘값’ 형태의 함수를 사용해보자

df.loc[df.eval("평균>=75 and 평균<80"),'등급'] = 'S'
df.loc[df.eval("평균>=70 and 평균<75"),'등급'] = 'A'
df.loc[df.eval("평균>=65 and 평균<70"),'등급'] = 'B'
df.loc[df.eval("평균>=60 and 평균<65"),'등급'] = 'C'

df
국어 영어 수학 이름 총점 평균 등급
0 70 50 65 윤정호 185 61.67 C
1 80 45 70 아이유 195 65.00 B
2 90 85 45 슬기 220 73.33 A
3 60 75 95 윈터 230 76.67 S

번외, rank 함수 사용하기


만들어진 데이터프레임에서 rank 함수를 사용해 등수 칼럼을 추가해보자.

df['순위'] = df['평균'].rank(ascending=False)
df.sort_values(by=['순위']).reset_index(drop=True)

국어 영어 수학 이름 총점 평균 등급 순위
0 60 75 95 윈터 230 76.67 S 1.0
1 90 85 45 슬기 220 73.33 A 2.0
2 80 45 70 아이유 195 65.00 B 3.0
3 70 50 65 윤정호 185 61.67 C 4.0

참조 네이버블로그

댓글남기기