2014-02-07 3 views
10

팬더의 DataFrame 객체에서 apply 메소드를 사용하고 있습니다. DataFrame에 단일 열이 있으면 적용된 함수가 두 번 호출되는 것 같습니다. 질문은 왜 그런가? 그리고 그 행동을 멈출 수 있습니까?팬더가 두 번 계산하는 이유

코드 :

import pandas as pd 

def mul2(x): 
    print 'hello' 
    return 2*x 

df = pd.DataFrame({'a': [1,2,0.67,1.34]}) 

print df.apply(mul2) 

가 출력 :

hello 
hello 

0 2.00 
1 4.00 
2 1.34 
3 2.68 

나는 '안녕하세요'함수 내에서 인쇄하고있어이 적용된다. 'hello'가 두 번 인쇄 되었기 때문에 두 번 적용됩니다. 더 중요한 것은 두 열이 있다면 '여보세요'가 3 번 인쇄된다는 것입니다. "hello"열을 4 번 인쇄하면됩니다.

코드는 :

print df.a.apply(mul2) 

는 출력 :

hello 
hello 
hello 
hello 
0 2.00 
1 4.00 
2 1.34 
3 2.68 
Name: a, dtype: float64 

답변

4

아마 this issue 관련. groupby를 사용하면 적용된 함수를 추가 시간이라고하며 특정 최적화가 수행되는지 확인할 수 있습니다. 비슷한 일이 벌어지고있는 것 같아요. 현재 주위에 어떤 방법이있는 것처럼 보이지 않습니다 (내가 보는 행동의 근원에 대해 잘못 될 수는 있지만). 그 여분의 전화를하지 않아야하는 이유가 있나.

또한 열에 적용 할 때 네 번 호출하면 정상입니다. 하나의 컬럼을 얻으면 DataFrame이 아닌 Series를 얻게됩니다. 시리즈의 apply은 각각 요소에 함수를 적용합니다. 열에 네 개의 요소가 있으므로이 함수는 네 번 호출됩니다.

+0

사용하는 기능은 재귀 적입니다. 나는 그것이 필요 이상으로 재귀 계산을하는 것을 피하려고 노력하고있다. 지금 당장 문제는 아니지만 그렇게 될 수 있습니다. – piRSquared

3

이 동작은 최적화를위한 것입니다. 현재 구현에서

회 첫 열/행에 그것은 빠르거나 느린 코드 경로를 취할 수 있는지 여부를 결정하는 FUNC 전화를 적용

docs 참조. 이 첫 번째 열/행에 대해 두 번 적용되므로 func에 부작용이있는 경우 예기치 않은 동작이 발생할 수 있습니다.

관련 문제