2014-05-13 1 views
0

pandas.DataFrame.apply(myfunc)의 동작은 열을 따라 myfunc의 응용 프로그램입니다. pandas.core.groupby.DataFrameGroupBy.apply의 동작이 더 복잡합니다. 이 차이는 myfunc과 같이 frame.apply(myfunc) != myfunc(frame)과 같이 나타납니다.그룹화 된 DataFrame에서 pandas.DataFrame.apply를 강제하는 방법

제가 DataFrame는 다음 (각 그룹) 각 프레임의 열을 따라 myfunc를 적용하고 결과를 함께 붙여 그룹 싶다. 그것을 해커하는 방법이 있지만, 내가 놓친 몇 가지 간단한 kwarg가있는 것 같아요.

In [22]: df = pd.DataFrame({'a':range(5), 'b': range(5, 10)}) 

In [23]: df 
Out[23]: 
    a b 
0 0 5 
1 1 6 
2 2 7 
3 3 8 
4 4 9 

In [24]: def myfunc(data): 
      # Implements max in a funny way. 
      # However, this is just an example of a function such that 
      # myfunc(frame) != frame.apply(myfunc) 
      return data.values.ravel().max() 

In [25]: df.apply(myfunc) 
Out[25]: 
a 4 
b 9 

In [26]: df.groupby(df.a < 2).apply(myfunc) 
Out[26]: 
a 
False 9 
True  6 

당신이 볼 수 있듯이이 myfuncmyfunc(group) 같이 불렀다 :

아래의 예를 생각해 보자. myfuncDataFrame이며 숫자를 반환하기 때문에이 기본 동작은 합리적입니다. 그러나 이것은 항상 원하는 것이 아닙니다. 각 그룹의 열을 따라 myfunc을 적용하려면 표준 방식이 있습니까? 예 : group.apply(myfunc)? 내가 가지고 올 수있는 최고의 어색한 래퍼입니다 :

In [27]: def wrapped(frame): 
    ....:  return frame.apply(myfunc) 

In [28]: df.groupby(df.a < 2).apply(wrapped) 
Out[28]: 
     a b 
a   
False 4 9 
True 1 6 

답변

1

당신이

In [25]: df.groupby(df.a<2).aggregate(myfunc) 
Out[25]: 
     a b 
a   
False 4 9 
True 1 6 

[2 rows x 2 columns] 

할 수 그러나 이것은 나를 위해 작동하지 않는 불행하게도 간단

In [26]: df.groupby(df.a<2).max() 
Out[26]: 
     a b 
a   
False 4 9 
True 1 6 

[2 rows x 2 columns] 
+0

입니다 : DF .groupby (df.a <2) .aggregate (myfunc)는 DataFrame ({ 'a : [9, 6],'b ': [9,6]}, index = [False, True])을 반환합니다. 즉, g.apply (myfunc)가 아닌 myfunc (g) (g == a 그룹)이었습니다. 집계에 대한 docstring은이 둘을 시도하지만 시도한 순서는 지정하지 않음을 지정합니다. 또한 myfunc가 예제이기 때문에 .max()가이 경우를 해결하지만 아직 답변을 찾고 있습니다. 저는 0.12 버전입니다. –

+0

왜이 기능이 작동하지 않습니까? – Jeff

+0

[@Ian Langmore] (http://stackoverflow.com/users/993872/ian-langmore),'myfunc'의 리턴을'return data.max()'로 변경하십시오. 당신은 두 열 (당신이 그것들을 분리하기를 원하는)을'래블 (ravel) '하고 싶지 않습니다. –

관련 문제