Мне нужна помощь с какой-то большой проблемой панд.
Поскольку многие люди просили получить реальный ввод и действительно желаемый результат, чтобы ответить на вопрос, вот оно: Итак, у меня есть следующий фрейм данных
Date user cumulative_num_exercises total_exercises %_exercises
2017-01-01 1 2 7 28,57
2017-01-01 2 1 7 14.28
2017-01-01 4 3 7 42,85
2017-01-01 10 1 7 14,28
2017-02-02 1 2 14 14,28
2017-02-02 2 3 14 21,42
2017-02-02 4 4 14 28,57
2017-02-02 10 5 14 35,71
2017-03-03 1 3 17 17,64
2017-03-03 2 3 17 17,64
2017-03-03 4 5 17 29,41
2017-03-03 10 6 17 35,29
%_exercises_accum
28,57
42,85
85,7
100
14,28
35,7
64,27
100
17,64
35,28
64,69
100
-Столбец% _exercises - это значение столбца (cumulative_num_exercises / total_exercises) * 100-Столбец% _exercises_accum - это значение суммы% _exercises за каждый месяц .(Обратите внимание, что в конце каждого месяца он достигает значения 100).
- мне нужно рассчитать, используя эти данные,% пользователей, которые внесли свой вклад в 50%, 80% и 90%из общего числа упражнений, в течение каждого месяца.
-Для этого я подумал о создании нового столбца под названием категория, который позже будет использоваться для подсчета количества пользователей, внесших вклад в каждый из 3проценты (50%, 80% и 90%).Столбец категории принимает следующие значения:
0, если пользователь выполнил% _exercises_accum = 0.
1, если пользователь выполнил%_exercises_accum <50 и> 0.
50, если пользователь выполнил% _exercises_accum = 50.
80, если пользователь выполнил% _exercises_accum= 80.
90, если пользователь выполнил% _exercises_accum = 90.
И так далее, потому что существует много случаев, чтобыопределить, кто вносит вклад в какой процент от общего количества упражнений в каждом месяце.
Я уже определил все случаи и все значения, которые должны быть приняты.
По сути, я пересекаю фрейм данныхиспользуя для цикла и два основных ifs :
if (df.iloc [i] [date] == df.iloc [i] [date]] .shift ()):
вычислений для определения процента или процентов, в которые вносит вклад пользователь от второй до последней строки группы того же месяца (потому чтоодин и тот же пользователь может внести свой вклад во все проценты или более чем в один)
else:
вычислений, чтобы определить, какой процент упражнений вносит первый член группы каждого месяца.
В расчетах используются:
Просмотр значения столбца категории в предыдущей строке с использованием shift ().
Выполнение в то время какЦиклы внутри for, потому что когда пользователь неожиданно достигает большого процента, нам нужно вернуться к пользователям в том же месяце и изменить их значение category_column на 50, поскольку они внесли свой вклад в 50%, но не достиглиЭто.например, в этой ситуации:
Дата% _exercises_accum 2017-01-01 1,24 2017-01-01 3,53 2017-01-01 20,25 2017-01-01 55,5
Желаемый вывод для данного кадра данных в начале вопроса будет включать те же столбцы, что и раньше (дата, пользователь, cumulative_num_exercises, total_exercises,% _exercises и% _exercises_accum) плюс столбец категории,это следующее:
category
50
50
508090
90
50
50
5080
8090
50
50
5080
8090
Обратите внимание, что строки со значениями: 508090 или 8090 означают, что этот пользователь участвует в создании:
508090:50%, 80% и 90% от общего количества упражнений в месяц.
8090: 80% и 90% упражнений в месяц.
Кто-нибудь знает, как можно упростить этот цикл for, обходя группы группы по объекту?
Большое спасибо!