Я пытаюсь применить функцию к столбцу за группой с целью создания 2 новых столбцов, содержащих возвращенные значения функции для каждой группы. Пример выглядит следующим образом:
def testms(x):
mu = np.sum(x)
si = np.sum(x)/2
return mu, si
df = pd.concat([pd.DataFrame({'A' : [1, 1, 1, 1, 1, 2, 2, 2, 2, 2]}), pd.DataFrame({'B' : np.random.rand(10)})],axis=1)
df
A B
0 1 0.696761
1 1 0.035178
2 1 0.468180
3 1 0.157818
4 1 0.281470
5 2 0.377689
6 2 0.336046
7 2 0.005879
8 2 0.747436
9 2 0.772405
desired_result =
A B mu si
0 1 0.696761 1.652595 0.826297
1 1 0.035178 1.652595 0.826297
2 1 0.468180 1.652595 0.826297
3 1 0.157818 1.652595 0.826297
4 1 0.281470 1.652595 0.826297
5 2 0.377689 2.997657 1.498829
6 2 0.336046 2.997657 1.498829
7 2 0.005879 2.997657 1.498829
8 2 0.747436 2.997657 1.498829
9 2 0.772405 2.997657 1.498829
Я думаю, что нашел решение, но я ищу что-то более элегантное и эффективное:
x = df.groupby('A')['B'].apply(lambda x: pd.Series(testms(x),index=['mu','si']))
A
1 mu 1.652595
si 0.826297
2 mu 2.997657
si 1.498829
Name: B, dtype: float64
df.merge(x.drop(labels='mu',level=1),on='A',how='outer').merge(x.drop(labels='si',level=1),on='A',how='outer')