Python pandas按CAT列类别分别执行时间维度分组计算资源R的方案
pandas按CAT分组统计各时间段资源占用量实现方案
问题背景
现有pandas DataFrame(记为df),需要基于开始时间ST、结束时间ET对资源变量R做分组统计,原始代码可以输出全量R的逐分钟累计值,但未区分CAT字段的类别取值,需要调整代码实现对每个CAT取值分别执行计算逻辑。
示例数据(表1)
import pandas as pd df=pd.DataFrame({'RID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, 'ST': {0: '0 days 04:52:00', 1: '0 days 04:54:00', 2: '0 days 04:56:00', 3: '0 days 04:57:00', 4: '0 days 04:57:00', 5: '0 days 05:02:00', 6: '0 days 05:04:00', 7: '0 days 05:04:00', 8: '0 days 05:06:00', 9: '0 days 05:07:00'}, 'ET': {0: '0 days 05:06:00', 1: '0 days 08:59:00', 2: '0 days 10:16:00', 3: '0 days 09:15:00', 4: '1 days 01:33:00', 5: '0 days 08:53:00', 6: '0 days 19:08:00', 7: '0 days 20:23:00', 8: '0 days 09:24:00', 9: '0 days 08:20:00'}, 'R': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}, 'CAT': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 3}}) # 提前转换时间类型避免重复计算 df['ST'] = pd.to_timedelta(df['ST']) df['ET'] = pd.to_timedelta(df['ET'])
原始代码(未分组版本)
df1 = df.set_index('ET') df2 = df.set_index('ST') df_final = df1.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0)\ .subtract(df2.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0), fill_value=0)\ .cumsum() x = pd.DataFrame(df_final.reset_index())
调整后按CAT分组的代码
核心思路是把原有逻辑封装为函数,通过groupby('CAT').apply()对每个类别单独计算:
def calc_cat_r(group): # 单个CAT分组内执行原有统计逻辑 g_et = group.set_index('ET') g_st = group.set_index('ST') et_sum = g_et.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0) st_sum = g_st.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0) res = et_sum.subtract(st_sum, fill_value=0).cumsum() return res # 按CAT分组计算,结果自动保留CAT字段 x_grouped = df.groupby('CAT').apply(calc_cat_r).reset_index() # 重命名列方便后续使用 x_grouped.columns = ['CAT', '时间', 'R累计值']
可选扩展:结果宽表转换
如果需要把不同CAT的累计值展开为独立列,可补充pivot操作:
x_pivot = x_grouped.pivot(index='时间', columns='CAT', values='R累计值').fillna(0).reset_index()
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

