Допустим, у вас есть следующий фрейм данных:
data = pd.DataFrame({'Year': [2019]*5+[2020]*5,
'Month': [1,1,2,2,3]*2,
'Hour': [0,1,2,3,4]*2,
'Value': [0.2,0.3,0.2,0.1,0.4,0.3,0.2,0.5,0.1,0.2]})
Затем установите «низкое» время равным часам от 1 до 3 (включительно), а «высокое» время равным всем остальным часам (в этом случае часов 0 и 4).То, что я хотел бы сделать, это получить среднее значение Value
для «низкого» и «высокого» времени для каждого Year
и Month
.В идеале они должны быть добавлены в качестве новых столбцов к фрейму данных groupby () (т. Е. Конечный фрейм данных будет иметь столбцы Year
, Month
, Low
и High
).
Для цикловработать, но они не идеальны.Я также мог бы создать фиктивную переменную (например, 0 с и 1 с), чтобы обозначить «низкое» и «высокое» время в кадре данных для группировки.Однако мне кажется, что должен быть какой-то способ использования Pandas groupby (['Year', 'Month']). Agg (...) для достижения результата эффективным / оптимальным способом.До сих пор мне не повезло с использованием groupby + agg, в основном потому, что agg () использует только серию (не оставшийся фрейм данных), поэтому нельзя использовать условное выражение внутри agg на основе Hour
для вычисления среднегоValue
.
Ожидаемый результат от данных выборки:
Year Month High Low
0 2019 1 0.2 0.30
1 2019 2 NaN 0.15
2 2019 3 0.4 NaN
3 2020 1 0.3 0.20
4 2020 2 NaN 0.30
5 2020 3 0.2 NaN
Любая помощь приветствуется:)