我想对多索引熊猫数据框的每一列应用一个函数。
如果我有一个返回标量的函数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_1
是x_2
产生的两列(命名并不重要,可以是任何东西)。请注意,组变得越来越短。
答案 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