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
당신이 볼 수 있듯이이 myfunc
이 myfunc(group)
같이 불렀다 :
myfunc
은
DataFrame
이며 숫자를 반환하기 때문에이 기본 동작은 합리적입니다. 그러나 이것은 항상 원하는 것이 아닙니다. 각 그룹의 열을 따라
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
입니다 : 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 버전입니다. –
왜이 기능이 작동하지 않습니까? – Jeff
[@Ian Langmore] (http://stackoverflow.com/users/993872/ian-langmore),'myfunc'의 리턴을'return data.max()'로 변경하십시오. 당신은 두 열 (당신이 그것들을 분리하기를 원하는)을'래블 (ravel) '하고 싶지 않습니다. –