#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()