在熊猫中,如何将函数应用于返回两列的每一列

时间:2020-02-02 14:08:19

标签: pandas pandas-groupby

我想对多索引熊猫数据框的每一列应用一个函数。

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

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

但是,考虑另一个函数my_function_array()将一个数组(一组中的所有n行)作为输入,并返回一个n x 2数组作为输出。

如何将其应用于分组数据框data_grouped的每一列?也就是说,我要获取m行的分组数据中的每一列,并用n x 2的{​​{1}}输出代替。

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

my_function_array()

将该函数应用于第二列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_1x_2产生的两列(命名并不重要,可以是任何东西)。请注意,组变得越来越短。

1 个答案:

答案 0 :(得分:1)

我认为您需要返回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