pandas.DataFrame.apply(myfunc)
的行为是myfunc
沿列的应用。
pandas.core.groupby.DataFrameGroupBy.apply
的行为更复杂。这种差异显示为myfunc
的函数frame.apply(myfunc) != myfunc(frame)
。
我想将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
答案 0 :(得分: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]