python/Pandas | Numpy
[Pandas] eval() (열 간 수식을 짧고 빠르게 처리)
Balang
2025. 4. 24. 12:44
728x90
여러 열을 계산해서 새로운 값을 만들고 싶을 때, Pandas에서는 다음과 같이 df['A'] + df['B'] 식으로 연산을 한다.
하지만 열 이름이 길거나 계산이 많아지면 가독성이 떨어지고, 성능도 비효율적이다.
eval()은 수식을 문자열처럼 입력하면 Pandas 내부에서 빠르게 처리해주는 함수다.
특히 속도와 코드 가독성이 중요한 실무 상황에서 진가를 발휘한다.
예제 데이터
import pandas as pd
df = pd.DataFrame({
'math': [90, 80, 70],
'eng': [85, 75, 65],
'sci': [88, 78, 68]
})
기본 문법
df.eval('새_컬럼명 = 수식', inplace=False)
- 수식: 문자열로 작성 ('col1 + col2')
- inplace=True 설정 시 원본 변경
- 열 이름은 따옴표 없이 사용
- 외부 변수는 @변수명 사용
1. 예제: 열 간 계산 후 새 컬럼 생성
df.eval('total = math + eng + sci', inplace=True)
→ 새로운 컬럼 total 생성
2. 예제: 계산 결과를 바로 조건 필터링에 활용
df.query('math + eng >= 160')
또는
df[df.eval('math + eng >= 160')]
→ eval()을 query()와 함께 사용해 조건식을 줄이고 가독성 높이기
3. 예제: 외부 변수 사용
bonus = 10
df.eval('final_score = math + eng + @bonus', inplace=True)
→ 외부 변수는 @변수명으로 바인딩 가능
4. 예제: 중간 단계 없이 복잡한 계산 처리
df.eval('adjusted = (math * 0.4 + eng * 0.3 + sci * 0.3) * 1.05', inplace=True)
→ 중간 컬럼 없이 한번에 연산 처리
5. 예제: 기존 열 덮어쓰기
df.eval('math = math + 5', inplace=True)
→ math 점수 전체 5점 추가 (열 업데이트)
주의사항
주의사항 | 설명 |
열 이름에 공백이나 특수문자 있을 경우 | 백틱()으로 감싸야 함: ``df.eval("total score` = math + eng")`` |
열 이름은 문자열 아님 | 'math'처럼 따옴표 쓰면 안 됨 |
외부 변수는 @변수명 | 일반 파이썬 변수는 @ 없으면 인식 안 됨 |
inplace 기본값은 False | 결과를 저장하려면 inplace=True 또는 재할당 필요 |
성능 비교 (optional 참고용)
import timeit
# 일반 방식
t1 = timeit.timeit("df['res'] = df['math'] + df['eng'] + df['sci']", globals=globals(), number=100)
# eval 방식
t2 = timeit.timeit("df.eval('res = math + eng + sci', inplace=True)", globals=globals(), number=100)
print(f"기본 연산: {t1:.4f}초, eval 연산: {t2:.4f}초")
→ 일반적으로 eval()이 대용량에서는 더 빠른 경우가 많음
eval()은 Pandas에서 수식 계산을 더 직관적으로, 더 간단하게 만들어주는 함수다.
수많은 컬럼을 계산하거나 파생 컬럼을 만들 때,
eval()을 활용하면 코드 길이를 줄이면서도 가독성, 성능 모두 잡을 수 있다.
728x90
반응형