#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.