pandas:从二维和一维数组的组合中创建一个DataFrame

时间:2013-08-28 00:13:23

标签: python pandas

我经常需要调用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系列。

1 个答案:

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