Как получить n-е по величине значения из определенного столбца с помощью groupby и выполнить вычисления для другого столбца в той же строке

#pandas #pandas-groupby

#pandas #pandas-groupby

Вопрос:

У меня есть pandas dataframe dd:

 Experiment  Position    Lap ID     Partition    Value
Expt1       2000        104 127327203   2       52.01
Expt1       2000        105 127327203   2       51.78
Expt1       2000        106 127327203   2       51.57
Expt1       2000        107 127327203   2       51.63
Expt1       2000        108 127327203   2       51.61
Expt1       2000        109 127327203   2       51.78
Expt1       2000        110 127327203   2       51.78
Expt1       2000        111 127327203   2       51.53
Expt1       2000        112 127327203   2       51.69
Expt1       2000        113 127327203   2       51.53
Expt1       2000        114 127327203   2       51.40
Expt1       2000        115 127327203   2       51.45
Expt1       2000        116 127327203   2       51.47
Expt1       2000        117 127327203   2       51.61
Expt1       2000        118 127327203   2       50.89
Expt1       2500        104 127327203   2       52.16
Expt1       2500        105 127327203   2       53.14
Expt1       2500        106 127327203   2       52.02
  

Мои данные составляют несколько тысяч строк и содержат много экспериментов, поэтому приведенное выше — всего лишь снимок.

Я хочу провести эксперимент с groupby, затем расположить, а затем выполнить круг

 grouped = dd.groupby(['Experiment','Position','Lap']) 
grouped.first()
  

Это дает мне:

введите описание изображения здесь

Теперь я хочу просто использовать 10-е по величине значения в столбце «Круг», чтобы получить среднее значение и std столбца «Значение».

Если возможно, я хотел бы затем вывести в новый фрейм данных эксперимент, положение и результат приведенных выше вычислений, чтобы затем я мог построить график.

спасибо за любую помощь

Ответ №1:

Первый фильтр по подсчетам по GroupBy.transform и GroupBy.size с Series.ge для >=10 и boolean indexing :

 df = df[df.groupby(['Experiment','Position'])['Value'].transform('size').ge(10)]
  

Использование DataFrame.sort_values несколькими столбцами с GroupBy.tail :

 df1 = (df.sort_values(['Experiment','Position','Lap', 'Value'])
        .groupby(['Experiment','Position'])
        .tail(10))
print (df1)
   Experiment  Position  Lap         ID  Partition  Value
5       Expt1      2000  109  127327203          2  51.78
6       Expt1      2000  110  127327203          2  51.78
7       Expt1      2000  111  127327203          2  51.53
8       Expt1      2000  112  127327203          2  51.69
9       Expt1      2000  113  127327203          2  51.53
10      Expt1      2000  114  127327203          2  51.40
11      Expt1      2000  115  127327203          2  51.45
12      Expt1      2000  116  127327203          2  51.47
13      Expt1      2000  117  127327203          2  51.61
14      Expt1      2000  118  127327203          2  50.89

df2 = df1.groupby(['Experiment','Position'])['Value'].agg([('avg','mean'),
                                                           ('q5', lambda x: x.quantile(.5))])
print (df2)
                        avg     q5
Experiment Position               
Expt1      2000      51.513  51.53
  

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

1. Это идеально, я не знал, что вы можете использовать tail таким образом, чтобы отфильтровывать группы размером менее 10. Как мне получить 5-й процентиль, а не std? Еще раз спасибо, это потрясающе

2. Я только что понял, что для значения позиции 2500, где есть только 3 значения, я не хочу, чтобы они вносили вклад в вычисление — только если их 10 или более.

3. @user11305439 — Отредактированный ответ.

4. Это фантастика … но довольно сложно понять. Можете ли вы предложить какое-либо чтение для таких примеров. Я ничего не нашел в Интернете. Еще раз спасибо

5. @user11305439 — Сложный вопрос, может быть, немного помогут учебные пособия , особенно современные pandas.