0

我经常需要调用 groupby().apply()。由于 apply() 的回调函数只允许返回一个系列或数据帧(或者可能是一个标量),如果我的回调函数需要返回一个一维和二维数组的元组,那将变得相当尴尬,因为我会有将它们打包到 DataFrame 中,然后在我从 apply() 获得结果后解压到数组中。

例子:

def my_callback(g):
"""This function takes the group g and calculates a two dim array and a 
one dim array"""
  a = np.ones(len(g),2)
  b = np.ones(len(g))
  #I need to return a and b 
  return a, b #this won't work

x = data.groupby('key').apply(my_callback)

有人有什么建议吗?如果 pandas 允许更灵活的回调返回值,那将更加方便。

现在来看几个用例,这里有几个例子: 案例 1:我需要将 DataFrame 转换为回归的自变量和因变量。转换涉及逐组生成 2D 数组和 1D 数组,然后将每个组中的数组行堆叠在一起。如果我能写就太好了:

X, Y = data.groupby('key').apply(my_callback)

使用 DataFrame 的作品,但它涉及 np.column_stack()。

案例2:我想将DataFrame逐组转换为两个不同行和列的数组。我认为今天没有任何方法可以做到这一点,除非我们将所有内容编码为 1D 系列。

4

1 回答 1

1

您不需要在此处使用 apply ,除非您使用可以在帧/系列上运行的 cythonized 函数,否则它对性能没有任何影响。

迭代 groupby 本身,创建一个“stuff”列表(在本例中为回调函数返回的元组)。然后你可以进一步处理。您可以在此处返回任何内容(如果您愿意,包括分组数据框)

[26]: df = DataFrame([['foo',1],['foo',2],['bar',3],['bar',4]],columns=list('AB'))

In [27]: df
Out[27]: 
     A  B
0  foo  1
1  foo  2
2  bar  3
3  bar  4

In [35]: def f(g, grp):
   ....:     return (g, len(grp), grp['B'].sum())
   ....: 

In [36]: print [ f(g, grp) for g, grp in df.groupby('A') ]
[('bar', 2, 7), ('foo', 2, 3)]
于 2013-08-28T21:42:41.030 回答