Python pandas:从二维和一维数组组合生成数据帧

Python pandas:从二维和一维数组组合生成数据帧,python,pandas,Python,Pandas,我经常需要调用groupby().apply()。由于apply()的回调函数只允许返回一个序列或数据帧(或者可能是一个标量),如果我的回调函数需要返回一个一维和二维数组的元组,这将变得相当尴尬,因为我必须将它们打包到一个数据帧中,然后在从apply()获得结果后再解压缩到数组中 例如: def my_callback(g): """This function takes the group g and calculates a two dim array and a one dim arra

我经常需要调用groupby().apply()。由于apply()的回调函数只允许返回一个序列或数据帧(或者可能是一个标量),如果我的回调函数需要返回一个一维和二维数组的元组,这将变得相当尴尬,因为我必须将它们打包到一个数据帧中,然后在从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:我需要将数据帧转换为回归的自变量和因变量。转换涉及逐组生成二维数组和一维数组,然后将每组中的数组行堆叠在一起。如果我能写,那就太好了:

X, Y = data.groupby('key').apply(my_callback)
使用DataFrame类是可行的,但它涉及np.column_stack()


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

在这里不需要使用apply,除非您使用的是可以在帧/系列上操作的cythonized函数,否则它不会对性能产生任何影响

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


你想在这里实现什么?为什么你不能合并结果然后解包呢?我认为如果你想从
groupby
操作返回
tuple
,那就更尴尬了。我试图将数据帧中的数据点逐组转换为二维数组,然后将相同的数据转换为不同的一维数组数组。例如,二维数组可以是回归的自变量,而一维数组可以是因变量。我本可以编写两个函数,每个数组一个,然后分别应用它们,但这将非常缓慢。因此,最好只遍历一次数据并生成两个数组。至于为什么将结果打包到数据帧中会很尴尬,更不用说速度很慢了。二维数组是np.dot()的结果。因此,当我需要构造数据帧作为返回值时,我手头有一个二维数组和一个一维数组。然后,我可以使用np.column_stack将它们堆叠在一起,或者编写一个循环,将两个dim数组一次一列地切片到一个dict。这两种方法都不理想。这不是另一个问题的重复。另一个问题是返回两个标量。我在pandas github上找到了这个用例。我在这里返回两个不同维度的数组。
[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)]