我经常需要调用groupby()。apply()。由于apply()的回调函数只允许返回一个Series或DataFrame(或者可能是一个标量),如果我的回调函数需要返回一维和二维数组的元组,它会变得相当尴尬,因为我会有将它们打包到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系列。
答案 0 :(得分:1)
你不需要在这里使用apply,除非你使用的是一个可以在一个帧/系列上运行的cythonized函数,否则它对perf没有任何影响。
对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)]