Назначьте время ответа на каждый вопрос в анкете Moodle, используя groupby pandas - PullRequest
0 голосов
/ 10 июля 2020

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

Пример ДАННЫХ (2 студента и 4 вопроса)

original= [{"Student":"S1","Send":"0:00:00"},{"Student":"S1","Send":"0:01:00"},{"Student":"S1","Send":"0:02:00"},{"Student":"S1","Send":"0:04:00"},{"Student":"S1","Send":"0:05:00"},{"Student":"S2","Send":"0:00:00"},{"Student":"S2","Send":"0:02:00"},{"Student":"S2","Send":"0:04:00"},{"Student":"S2","Send":"0:04:00"},{"Student":"S2","Send":"0:05:00"}]
df = pd.DataFrame(original)
df['Send'] =pd.to_datetime(df['Send'], format='%H:%M:%S') - pd.to_datetime(df['Send'], format='%H:%M:%S').dt.normalize()
df['diff'] = df.sort_values(['Student','Send']).groupby('Student')['Send'].diff()
df
   Send    Student     diff
0 00:00:00      S1      NaT
1 00:01:00      S1 00:01:00  # Send[1]-Send[0]= S1 Time response to P1
2 00:02:00      S1 00:01:00
3 00:04:00      S1 00:02:00
4 00:05:00      S1 00:01:00
5 00:00:00      S2      NaT
6 00:02:00      S2 00:02:00
7 00:04:00      S2 00:02:00
8 00:04:00      S2 00:00:00
9 00:05:00      S2 00:01:00

И я ищу решение, подобное этому: новый фрейм данных, который собирает имя студента и время ответа (столбец diff) для каждого вопроса. Примерно так

  Student | P1      | P2      | P3      | P4      
 ---------|---------|---------|---------|--------- 
  S1      | 0:01:00 | 0:01:00 | 0:02:00 | 0:01:00 
  S2      | 0:02:00 | 0:02:00 | 0:00:00 | 0:01:00 

Соображения:

  • в данных примера первое значение каждого студента (индекс 0 для S1 и индекс 6 для S2) - это время, в которое был отображен вопрос
  • второе значение для каждого ученика (индекс 2 для S1) - это момент, когда ученик сохраняет первый ответ.
  • Таким образом, время ответа составляет 0:01:00 - 0 : 00: 00 (Отправить [1] -Отправить [0])

Я уверен, что это простая проблема, но сейчас я застрял и не знаю, как выйти из этого тупика. Любая помощь будет приветствоваться

1 Ответ

0 голосов
/ 12 июля 2020

Скопируйте столбец 'diff', чтобы создать столбец кумулятивных значений, который будет сброшен на 0. Сгруппируйте его со столбцом 'Student' и преобразуйте таблицу оттуда.

df['P_No'] = df['diff'].apply(lambda x: pd.NaT if pd.isnull(x) else 1).fillna(0)
df['P_No'] = df['P_No'].groupby((df['P_No']-df['P_No'].shift() !=0).cumsum()).cumsum()
df = df[df['diff'].notnull()].groupby(['Student','P_No'])['diff'].agg(sum).unstack()
df = df.rename_axis(columns=None).reset_index()
new_col = [ c if c == 'Student' else 'P'+str(c) for c in df.columns]
df.columns = new_col
df

Student P1  P2  P3  P4
0   S1  00:01:00    00:01:00    00:02:00    00:01:00
1   S2  00:02:00    00:02:00    00:00:00    00:01:00
...