如何在分组的DataFrame上强制使用pandas.DataFrame.apply

时间:2014-05-13 15:35:45

标签: python pandas

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

1 个答案:

答案 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]