Панды - получить последние значения 'n' столбцов сгруппированных данных - PullRequest
0 голосов
/ 29 октября 2018

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

| Job Name   | Region        | Status | Timestamp            |
| some_job_1 | some_region_1 | DONE   | 2018-10-02T03:46:25Z |
| some_job_1 | some_region_2 | ERROR  | 2018-10-02T03:44:25Z |
| some_job_2 | some_region_1 | DONE   | 2018-10-01T03:46:25Z |
| some_job_1 | some_region_2 | ERROR  | 2018-11-02T03:44:25Z |

Теперь я хочу, чтобы 5 самых неудачных заданий за промежуток времени были последними, а статус выполнения 'n'. Который должен выглядеть примерно так:

| Job Name   | Region        | DONE | ERROR | Last 5 runs                  |
| some_job_1 | some_region_1 | 3    | 12    | ERROR DONE ERROR ERROR ERROR |
| some_job_1 | some_region_2 | 2    | 9     | ERROR DONE ERROR ERROR ERROR |
| some_job_2 | some_region_1 | 2    | 8     | ERROR DONE ERROR ERROR ERROR |
| some_job_2 | some_region_2 | 5    | 7     | ERROR DONE ERROR ERROR ERROR |
| some_job_3 | some_region_2 | 5    | 7     | ERROR DONE ERROR ERROR ERROR |

И я дошел до этого:

| Job Name   | Region        | DONE | ERROR | 
| some_job_1 | some_region_1 | 3    | 12    | 
| some_job_1 | some_region_2 | 2    | 9     | 
| some_job_2 | some_region_1 | 2    | 8     | 
| some_job_2 | some_region_2 | 5    | 7     | 
| some_job_3 | some_region_2 | 5    | 7     | 

с помощью:

data.groupby(['Job Name', 'Region']).Status.value_counts().unstack().fillna(0).sort_values('ERROR', ascending=False).head(5)

Я пытался использовать last(), но безуспешно. Цените, если кто-то может мне помочь!

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете определить агрегаты в отдельной функции agg и применить их к объекту groupby.

def aggs(data):
    values = dict(data['Status'].value_counts())
    values['Last'] = list(data[['Status', 'Timestamp']].sort_values('Timestamp', ascending=False)['Status'].head(5))
    return pd.Series(values, index=['DONE', 'ERROR', 'Last'])

data.groupby(['Job Name', 'Region']).apply(aggs).fillna(0)

                            DONE    ERROR   Last
Job Name    Region          
some_job_1  some_region_1   1.0     0.0    [DONE]
            some_region_2   0.0     2.0    [ERROR, ERROR]
some_job_2  some_region_1   1.0     0.0    [DONE]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...