Используйте pandas для сжатия кадра данных, используя значения из одного кадра данных, чтобы заполнить новый кадр данных - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь использовать Python pandas, чтобы взять несколько строк, которые имеют значения defect_*_day_flag как ИСТИНА и ЛОЖЬ, и создать новый кадр данных, сжатый. Использование phase_date из первого вхождения TRUE для создания нового столбца *_dttm для каждого из соответствующих столбцов defect_*_day_flag.

Исходные данные представляют ежедневный снимок (phase_date) для состояния данного bug_id. Данные выглядят примерно так:

phase_date  bug_id  creation_dttm   severity    status  defect_regression_day_flag  defect_reopen_day_flag  defect_backlog_day_flag defect_resolution_day_flag  defect_rejected_day_flag    defect_verified_day_flag    defect_failedtest_day_flag
2019-01-09  113998  2004-01-21 3:15:24  medium  NEW        FALSE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE
2019-01-10  113998  2004-01-21 3:15:24  medium  NEW        FALSE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE
2019-01-11  113998  2004-01-21 3:15:24  medium  ASSIGNED    FALSE   FALSE   TRUE    FALSE   FALSE   FALSE   FALSE
2019-01-12  113998  2004-01-21 3:15:24  medium  IN PROGRESS FALSE   FALSE   TRUE    FALSE   FALSE   FALSE   FALSE
2019-01-13  113998  2004-01-21 3:15:24  medium  IN PROGRESS FALSE   FALSE   TRUE    FALSE   FALSE   FALSE   FALSE
2019-01-14  113998  2004-01-21 3:15:24  medium  VERIFIED    FALSE   FALSE   FALSE   FALSE   FALSE   TRUE    FALSE
2019-01-15  113998  2004-01-21 3:15:24  medium  CLOSED  FALSE   FALSE   TRUE    TRUE    FALSE   FALSE   FALSE

И я пытаюсь добраться до:

bug_id  creation_dttm   severity    status  regression_dttm reopen_dttm backlog_dttm    resolution_dttm rejected_dttm   verified_dttm   failed_test_dttm
113998  2004-01-21 3:15:24  medium  CLOSED         NULL          NULL   2019-01-09         2019-01-15       NULL          2019-01-14        NULL

Обратите внимание, что в приведенном выше примере используется one speci c bug_id; однако в реальном наборе данных будут тысячи различных идентификаторов ошибок.

Новый кадр данных должен содержать самую последнюю строку для каждой ошибки вместе с несколькими важными столбцами из самой последней строки bug_id, т.е. серьезность, статус, creation_dttm, et c вместе с новыми *_dttm столбцами.

1 Ответ

1 голос
/ 08 февраля 2020

Для данных, как показано ниже:

   phase_date  bug_id       creation_dttm severity       status  defect_regression_day_flag  defect_reopen_day_flag  defect_backlog_day_flag  defect_resolution_day_flag  defect_rejected_day_flag  defect_verified_day_flag  defect_failedtest_day_flag
0  2019-01-09  113998  2004-01-21 3:15:24   medium          NEW                       False                   False                     True                       False                     False                     False                       False
1  2019-01-10  113998  2004-01-21 3:15:24   medium          NEW                       False                   False                     True                       False                     False                     False                       False
2  2019-01-11  113998  2004-01-21 3:15:24   medium     ASSIGNED                       False                   False                     True                       False                     False                     False                       False
3  2019-01-12  113998  2004-01-21 3:15:24   medium  IN PROGRESS                       False                   False                     True                       False                     False                     False                       False
4  2019-01-13  113998  2004-01-21 3:15:24   medium  IN PROGRESS                       False                   False                     True                       False                     False                     False                       False
5  2019-01-14  113998  2004-01-21 3:15:24   medium     VERIFIED                       False                   False                    False                       False                     False                      True                       False
6  2019-01-15  113998  2004-01-21 3:15:24   medium       CLOSED                       False                   False                     True                        True                     False                     False                       False
7  2019-01-14  113999  2004-01-21 3:15:24   medium     VERIFIED                       False                   False                    False                       False                     False                      True                       False
8  2019-01-15  113999  2004-01-21 3:15:24   medium       CLOSED                       False                   False                     True                        True                     False                     False                       False

Вам необходимо:

  1. группировать данные по bug_id
  2. для каждого столбца в группе найти первое вхождение из TRUE
  3. собирать данные и загружать в новый df
# group data
grouped_data = df.groupby('bug_id')

# collect data
final_data = []
for name, group in grouped_data:
    last_line = group.iloc[[-1]]
    data = {'bug_id': last_line['bug_id'].values[0], 'creation_dttm': last_line['creation_dttm'].values[0],
            'severity': last_line['severity'].values[0], 'status': last_line['status'].values[0]}

    column_names = list(group.columns)[5:]
    for column in column_names:
        true_occurrence = group[group[column] == True]
        if true_occurrence.shape[0] > 0:
            data[column] = true_occurrence['phase_date'].iloc[0]
        else:
            data[column] = 'NULL'

    final_data.append(data)

# save data
df_final = pd.DataFrame(final_data)

Вывод:

   bug_id       creation_dttm severity  status defect_regression_day_flag defect_reopen_day_flag defect_backlog_day_flag defect_resolution_day_flag defect_rejected_day_flag defect_verified_day_flag defect_failedtest_day_flag
0  113998  2004-01-21 3:15:24   medium  CLOSED                       NULL                   NULL              2019-01-09                 2019-01-15                     NULL               2019-01-14                       NULL
1  113999  2004-01-21 3:15:24   medium  CLOSED                       NULL                   NULL              2019-01-15                 2019-01-15                     NULL               2019-01-14                       NULL
...