在pandas中,如何对返回两列的每一列应用函数

在pandas中,如何对返回两列的每一列应用函数,pandas,pandas-groupby,Pandas,Pandas Groupby,我想对分组的多索引数据帧的每一列应用一个函数 如果我有一个返回标量的函数my_function(),我会使用 data_grouped = data.groupby(['type']) data_transf = data_grouped.apply(lambda x: my_function(x)) 但是,考虑另一个函数 MyOffice函数()/代码>将一个数组(所有 N< /代码>一组内的行)作为输入,并返回一个 n x 2 < /COD>数组作为输出。p> 如何将其应用于分组数据框的每

我想对分组的多索引数据帧的每一列应用一个函数

如果我有一个返回标量的函数
my_function()
,我会使用

data_grouped = data.groupby(['type'])
data_transf = data_grouped.apply(lambda x: my_function(x))

但是,考虑另一个函数<代码> MyOffice函数()/代码>将一个数组(所有<代码> N< /代码>一组内的行)作为输入,并返回一个<代码> n x 2 < /COD>数组作为输出。p> 如何将其应用于分组数据框的每一列?也就是说,我想获取

m
行的分组数据的每一列,并用
myu function\u array()
nx2
输出替换它

下面是一些示例数据。还有其他组(类型),但我只显示一个

type   frame   x            y           
F1675      1   77.369027    108.013249
           2   107.784096   22.177883
           3   22.385162    65.024619
           4   65.152003    77.74970

def my_function_array(data_vec, D=2, T=2):

    N = len(data_vec) - (D-1)*T # length of embedded signal
    embed_data = np.zeros([N,D])

    for di in range(-D//2,D//2):
        embed_data[:,di] = data_vec[ np.arange((D//2+di)*T, N+(D//2+di)*T) ]         

    return embed_data
将函数应用到第二列
y

my_function_array(np.array([108.013249, 22.177883, 65.024619, 77.74970]))
我有

array([[ 65.024619, 108.013249],
       [ 77.7497  ,  22.177883]])
因此,预期的输出是

    type   frame   x_1          x_2        y_1         y_2
   F1675       1   22.385162    77.369027   65.024619  108.013249
               2   65.152003   107.784096   77.7497     22.177883

其中
x_1
x_2
是由
x
产生的两列(命名不重要,可以是任何内容)。请注意,这些组变得越来越短,越来越宽

我想您需要返回
pd.DataFrame

def my_function_array(data_vec, D=2, T=2):
#    print (data_vec.name)

    N = len(data_vec) - (D-1)*T # length of embedded signal
    embed_data = np.zeros([N,D])

    for di in range(-D//2,D//2):
        embed_data[:,di] = data_vec[ np.arange((D//2+di)*T, N+(D//2+di)*T) ]         
    return pd.DataFrame(embed_data).add_prefix(data_vec.name)


f = lambda x: pd.concat([my_function_array(x[y]) for y in x], axis=1)

data_transf = data.groupby(['type']).apply(f)
print (data_transf)
                x0          x1         y0          y1
type                                                 
F1675 0  22.385162   77.369027  65.024619  108.013249
      1  65.152003  107.784096  77.749700   22.177883

是否可以添加一些示例数据、示例函数和预期输出?您好@jezrael,请查看我的扩展问题!谢谢非常接近!如何将其应用于数据帧的每一列?