본문 바로가기
2학년 2학기/데이터 사이언스 입문

[pandas] 고성능 Pandas: Eval & Query

by print_soo 2024. 11. 5.

넘파이와 판다스는 기본적으로 Vectorized를 지원하기 때문에 빠른 연산을 지원한다.  
 

다만, 위의 사진과 같은 복합적인 연산이 존재하는 경우,  실제 동작은 연산 하나하나를 메모리에 할당한 후에 저장을 한다. 따라서, x와 y의 크기가 큰 경우 메모리를 많이 차치하여 오히려 연산이 더 느려질 수 있다.
 
 

❓그럼 어떻게 해야할까?

연산을 한 번에 해주는 것이 아니라 부분적으로 나눠서 해줘야한다. 따라서 넘파이와 판다스에서는 큰 데이터에서도 효율적인 연산이 가능하도록 eval, query 함수를 제공한다.
 
 

1. eval 메소드의 사용

[pandas.eval(문자열)형태로 사용]

: 실행하고 싶은 연산을 문자열로 표현해서 사용할 수 있다.
 

결과 = pd.eval('연산')

 
 

 
이렇게 eval 메소드를 이용해도 동일한 경과가 나오면서 더 빠른 연산이 가능하다. 
 


[Column-wise 연산]

:  열끼리 연산도 바로 수행할 수 있다. 

 
 

🔥 NOTE! dataframe의 내장 메소드로 사용하면 더 편리하고 직관적으로 열 이름 사용이 가능하다. (단, dataframe 내장 메소드의 eval만 가능!) 🔥
 


 

[할당 연산도 사용 가능]

: 연산한 결과를 새로운 열에 바로 넣는 과정을 eval을 통해서 한번에 진행할 수 있다.
 

 
 

❓ DataFrame.eval()과 pandas.eval()의 차이는?

  • DataFrame.eval(): 특정 데이터 프레임 객체에 대해 연산을 수행할 수 있게 한다. 따라서 특정 데이터 프레임의 범위 내에서 로컬로 연산을 수행하며, 이로 인해 연산 속도가 빠르고 메모리 효율적이다 .
  • pandas.eval(): 전역적으로 판다스 전체를 대상으로 연산을 수행한다. 따라서, 여러 데이터 프레임 객체를 함께 사용하는 경우에 사용해야한다.

 


 

2. 지역 변수의 활용

: 지역변수를 @기호를 통해서 사용해서 연산을 할 수 있다. (단, dataframe 내장 메소드의 eval만 가능하다!)
 

 


 

3. query 메소드의 활용

 

❓ eval이 있는데 왜 query를 사용하는건가?

eval은 복잡한 수학적 연산(예를 들면 'df.A - df.B / df.C' 와 같은 것)을 효율적으로 수행하기 위해서 사용하고, query는 특정 조건에 따라 데이터를 필터링할 때 편리하게 사용한다. 
 
또한 마스킹 기반의 데이터 추출을 하는 경우 DataFrame.eval()를 사용해야하는데 DataFrame.eval()는 여러 데이터 프레임을 한번에 연산하기 때문에 하나의 데이터 프레임에서 DataFrame.query()을 사용해서 마스킹하는 과정은 상당히 비효율적이다. 
 

결과 = df.query('마스킹 조건')

 

왼: eval / 오: query

 
 
 
지역변수도 사용할 수 있다.