Обход групп по объектам панд - PullRequest
0 голосов
/ 01 мая 2019

Мне нужна помощь с какой-то большой проблемой панд.

Поскольку многие люди просили получить реальный ввод и действительно желаемый результат, чтобы ответить на вопрос, вот оно: Итак, у меня есть следующий фрейм данных

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:

вычислений, чтобы определить, какой процент упражнений вносит первый член группы каждого месяца.

В расчетах используются:

  1. Просмотр значения столбца категории в предыдущей строке с использованием shift ().

  2. Выполнение в то время какЦиклы внутри 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 означают, что этот пользователь участвует в создании:

  1. 508090:50%, 80% и 90% от общего количества упражнений в месяц.

  2. 8090: 80% и 90% упражнений в месяц.

Кто-нибудь знает, как можно упростить этот цикл for, обходя группы группы по объекту?

Большое спасибо!

1 Ответ

0 голосов
/ 01 мая 2019

Не имея представления о том, какие расчеты вы хотите выполнить, это мое лучшее предположение о том, что вы ищете. Однако я бы повторил точку зрения Датановице о том, что лучший способ получить ответы - предоставить пример вывода.

Вы можете нарезать каждую уникальную дату, используя следующий код:

dates = ['2017-01-01', '2017-01-01','2017-01-01','2017-01-01','2017-02-02','2017-02-02','2017-02-02','2017-02-02','2017-03-03','2017-03-03','2017-03-03','2017-03-03']
df = pd.DataFrame(
    {'date':pd.to_datetime(dates),
     'user': [1,2,4,10,1,2,4,10,1,2,4,10],
     'cumulative_num_exercises':[2,1,3,1,2,3,4,5,3,3,5,6],
     'total_exercises':[7,7,7,7,14,14,14,14,17,17,17,17]}
)

df = df.set_index('date')

for idx in df.index.unique():
    hold = df.loc[idx]

    ### YOUR CODE GOES HERE ###
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...