Pandas eval
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 |
참조 네이버블로그
댓글남기기