Панды анализа данных

#pandas #dataframe #statistics

#pandas #фрейм данных #Статистика

Вопрос:

Я разрабатываю анализ очень обширного набора данных, набор данных имеет атрибуты (g, месяц, p), которые организованы по группам с использованием groupby панд.

 G   month   p
G1  1   0.040698496
G1  2   0.225640771
G1  3   0.236948047
G1  4   0.119339576
G1  5   0.779272432
G2  1   0.892168636
G2  2   0.062467967
G2  3   0.936044226
G3  1   0.509212613
G3  2   0.476718744
G3  3   0.407299543
G3  4   0.843260893
G4  1   0.882554249
  

Затем я извлек статистику по группе G от 1 до n, как показано ниже

     g1  g2  g3  gn
mean    0.280379864 0.630226943 0.559122948 …
std 0.290326376 0.49218285  0.194135874 …
count   5   3   4 

требуется создать новое поле, которое является произведением среднего значения по группе на переменную p, есть какой-то способ сделать это автоматическим …, из-за расширения (более 200 групп), выполнение этого по отдельности занимает много времени.
ожидаемый результат

 G   month   p   STD*p
G1  1   0.040698496 0.011815847
G1  2   0.225640771 0.065509467
G1  3   0.236948047 0.068792268
G1  4   0.119339576 0.034647427
G1  5   0.779272432 0.226243341
G2  1   0.892168636 0.439110102
G2  2   0.062467967 0.030745662
G2  3   0.936044226 0.460704915
G3  1   0.509212613 0.098856436
G3  2   0.476718744 0.09254821
G3  3   0.407299543 0.079071453
G3  4   0.843260893 0.16370719
  

Ответ №1:

Используйте GroupBy.transform с std для повторения агрегированных значений, поэтому возможно многократное по p столбцу:

 df['STD*p'] = df.groupby('G')['p'].transform('std').mul(df['p'])
print (df)
     G  month         p     STD*p
0   G1      1  0.040698  0.011816
1   G1      2  0.225641  0.065509
2   G1      3  0.236948  0.068792
3   G1      4  0.119340  0.034647
4   G1      5  0.779272  0.226243
5   G2      1  0.892169  0.439110
6   G2      2  0.062468  0.030746
7   G2      3  0.936044  0.460705
8   G3      1  0.509213  0.098856
9   G3      2  0.476719  0.092548
10  G3      3  0.407300  0.079071
11  G3      4  0.843261  0.163707
12  G4      1  0.882554       NaN
  

Комментарии:

1. Этот метод (.transform) может применяться, например, если я хочу умножить столбец на уравнение, например (std * p)/ len(‘p)’ ?

2. @KarelSanchezHernandez — Нет, это только повторное std значение, если нужно добавить эту формулу .div(df.groupby('G')['p'].transform('size')) — если нужно подсчитать значение для групп

3. @KarelSanchezHernandez — Вы можете проверить, как это работает df.groupby('G')['p'].transform('std') по сравнению с df.groupby('G')['p'].std()