Первый фильтр по подсчетам по GroupBy.transform
и GroupBy.size
с Series.ge
для >=10
и boolean indexing
[1112 ]:
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
Осуществите рефакторинг ад из него, работающий к последовательному стилю дизайна, как предварительное мероприятие перед портированием его к платформе, самой близкой в духе к тому, чем тот стиль заканчивает тем, что был.
"Осуществляют рефакторинг", я имею в виду - представляют тесты в стратегически важных точках, единице, а также функциональный, и работа как безумный для сокращения дублирования, облокачиваясь на эти тесты.
Нет четкого ответа для этого вида вопроса, но моя основная подсказка должна была бы сначала читать на предмете. Прочитайте книги людей, которые знают материал, о котором они говорят.
Например, Код, Завершенный (Steve McConnell), ch. 24 Рефакторинга.
Сохраните код, с которого Вы запускаете
Сохраните рефакторинги маленькими
Сделайте тот, осуществляющий рефакторинг за один раз
Осуществите рефакторинг, когда Вы добавите стандартную программу, класс, почините дефект
Определите интерфейс между чистым и ужасным кодом
...
Существует много других ресурсов, распечатанных и онлайн, который можно использовать. Впоследствии, если у Вас есть более конкретный вопрос, можно использовать сайты как ТАК для получения более полезного ответа, чем этот.
Я задал очень похожий вопрос несколько месяцев назад, некоторые ответы могли бы быть полезны для Вас:
Лучший способ: Используйте существующее приложение в качестве функциональной спецификации и создайте новое приложение с нуля (с некоторым возможным cut-n-paste повторным использованием или фактическим повторным использованием класса, где это имеет смысл).
На основе моего опыта пробуя к рожку для обуви плохо записанное приложение прежней версии в новую платформу или попытка "перенести" код спама с хорошим кодом просто приводят к чему-то, что является еще более трудным и дорогим для поддержания в конечном счете.
это - просто мое мнение, потому что я думаю, что этот вопрос - то, что люди платят дорогим консультантам для разработки (и обычно заканчивать тем просто, что тратили впустую деньги! см. thedailywtf.com для примеров).
Я думаю не стоящий полного, переписывают, потому что во время процесса перезаписи, Вам, возможно, придется также поддержать исходное приложение*, и таким образом переписывание будет иметь движущуюся цель. лучший путь состоит в том, чтобы заплатить долг кода, поскольку Вы осуществляете рефакторинг - т.е. он возьмет 2x, 3x или даже 10x усилие реализовать одну простую опцию, просто потому что выполнение его хорошим способом включает "кучу" рефакторинга. но это усилие необходимо, поскольку долг, бывший должный в этом приложении, высок, и в конечном счете должен быть оплачен так или иначе.
это может причинить боль, но хороший вред медицины.