Создайте новый Dataframe на основе разницы во времени и условия для столбцов в pandas dataframe. - PullRequest
2 голосов
/ 09 июля 2019

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

ticketID    ChangeDate  OldStatus   NewStatus
0   1012327 2019-03-18 09:00:32.903 R or O  Action mail sent to client
1   1012327 2019-03-18 09:21:34.820 Action mail sent to client  Response Client - R
2   1012327 2019-03-18 09:34:21.890 Response Client - R Status Updated
3   1012328 2019-03-18 07:00:09.960 R or O  ticket Closed - None
4   1012328 2019-03-18 07:09:31.420 ticket Closed - None    Status Updated
5   1012329 2019-03-18 06:52:03.490 R or O  ticket Closed - Satisfied
6   1012329 2019-03-18 07:09:33.433 ticket Closed - Satisfied   Status Updated
7   1012330 2019-03-18 10:25:13.493 R or O  Action mail sent to Service
8   1012330 2019-03-18 10:55:20.963 Action mail sent to Service ticket Closed - Service Responded
9   1012330 2019-03-18 11:02:05.327 ticket Closed - Service Responded   Status Updated
10  1012332 2019-03-18 09:00:41.967 R or O  Action mail sent to client
11  1012332 2019-03-18 10:24:20.150 Action mail sent to client  Response Client - R
12  1012332 2019-03-18 10:32:40.717 Response Client - R Status Updated

Dataframe in Pandas Table

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

Я хочу создать новый фрейм / серию данных в следующем формате.

ticket ID  | Datetime1  | Oldest Status  | New Status | Datetime2  | New Status2| Datetime3  | New Status3 ....

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

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

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Мы можем groupby на ticketID и агрегировать в список для каждого столбца. Затем мы разбиваем эти списки на столбцы и присваиваем им префикс в этом случае, чтобы можно было правильно их сортировать:

def aggregate_data(dataframe, groupcol, col):
    grp = dataframe.groupby(groupcol).agg(list)

    temp = pd.DataFrame(grp[col].to_numpy().tolist(), index=grp.index)

    temp.columns = [f'{c}_{col}' for c in temp.columns]

    return temp

new = pd.concat([aggregate_data(df, 'ticketID', column) for column in df.iloc[:, 1:].columns], 
                axis=1).sort_index(axis=1).reset_index()
   ticketID             0_ChangeDate                  0_NewStatus 0_OldStatus             1_ChangeDate                        1_NewStatus                  1_OldStatus             2_ChangeDate
0   1012327  2019-03-18 09:00:32.903   Action mail sent to client      R or O  2019-03-18 09:21:34.820                Response Client - R   Action mail sent to client  2019-03-18 09:34:21.890
1   1012328  2019-03-18 07:00:09.960         ticket Closed - None      R or O  2019-03-18 07:09:31.420                     Status Updated         ticket Closed - None                     None
2   1012329  2019-03-18 06:52:03.490    ticket Closed - Satisfied      R or O  2019-03-18 07:09:33.433                     Status Updated    ticket Closed - Satisfied                     None
3   1012330  2019-03-18 10:25:13.493  Action mail sent to Service      R or O  2019-03-18 10:55:20.963  ticket Closed - Service Responded  Action mail sent to Service  2019-03-18 11:02:05.327
4   1012332  2019-03-18 09:00:41.967   Action mail sent to client      R or O  2019-03-18 10:24:20.150                Response Client - R   Action mail sent to client  2019-03-18 10:32:40.717
2 голосов
/ 09 июля 2019

Сначала я использовал бы groupby на ticketID, чтобы вычислить ранг за тикет, а затем повернул фрейм данных, используя этот ранг в качестве столбца, и тикет в качестве индекса для получения ожидаемых данных.

После сортировки столбцов выполучить ожидаемый кадр данных.Время переименовывать столбцы и сбрасывать индекс, чтобы получить хороший фрейм данных.Код может быть:

df['rank'] = df.groupby('ticketID').apply(lambda x:
                                          pd.Series(range(len(x)))).values
resul = df.pivot('ticketID', 'rank').fillna('')
resul.columns = resul.columns.swaplevel()
resul.sort_index(axis=1,inplace=True, level=0, sort_remaining=False)
resul.columns = ['{1}_{0}'.format(*c) for c in resul.columns]
resul.reset_index(inplace=True)

С данными вашего примера это дает:

   ticketID             ChangeDate_0 OldStatus_0                  NewStatus_0             ChangeDate_1                  OldStatus_1                        NewStatus_1             ChangeDate_2                        OldStatus_2     NewStatus_2
0   1012327  2019-03-18 09:00:32.903      R or O   Action mail sent to client  2019-03-18 09:21:34.820   Action mail sent to client                Response Client - R  2019-03-18 09:34:21.890                Response Client - R  Status Updated
1   1012328  2019-03-18 07:00:09.960      R or O         ticket Closed - None  2019-03-18 07:09:31.420         ticket Closed - None                     Status Updated                                                                            
2   1012329  2019-03-18 06:52:03.490      R or O    ticket Closed - Satisfied  2019-03-18 07:09:33.433    ticket Closed - Satisfied                     Status Updated                                                                            
3   1012330  2019-03-18 10:25:13.493      R or O  Action mail sent to Service  2019-03-18 10:55:20.963  Action mail sent to Service  ticket Closed - Service Responded  2019-03-18 11:02:05.327  ticket Closed - Service Responded  Status Updated
4   1012332  2019-03-18 09:00:41.967      R or O   Action mail sent to client  2019-03-18 10:24:20.150   Action mail sent to client                Response Client - R  2019-03-18 10:32:40.717                Response Client - R  Status Updated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...