我是新 Pandas ,我有以下作业调度程序数据:
| 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()
但没有成功。如果有人可以帮助我,我将不胜感激!
最佳答案
您可以在单独的 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]
关于python - Pandas - 获取分组数据的最新 'n' 列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53044021/