对另一列python中的每个类别执行多个groupby

Posted

技术标签:

【中文标题】对另一列python中的每个类别执行多个groupby【英文标题】:perform multiple groupby for each category in another column python 【发布时间】:2021-12-23 08:18:08 【问题描述】:

如表 1(数据帧,df)所示,我想根据开始时间(ST)和结束时间(ET)对资源变量 R 进行分组。我使用以下代码 1 来执行任务。

表 1 (df)

RID ST              ET              R   CAT
1   0 days 04:52:00 0 days 05:06:00 1   1
2   0 days 04:54:00 0 days 08:59:00 1   1
3   0 days 04:56:00 0 days 10:16:00 1   1
4   0 days 04:57:00 0 days 09:15:00 1   2
5   0 days 04:57:00 1 days 01:33:00 1   2
6   0 days 05:02:00 0 days 08:53:00 1   2
7   0 days 05:04:00 0 days 19:08:00 1   3
8   0 days 05:04:00 0 days 20:23:00 1   3
9   0 days 05:06:00 0 days 09:24:00 1   3
10  0 days 05:07:00 0 days 08:20:00 1   3

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)

代码 1

df1.index=pd.to_timedelta(df['ET'])
df2.index=pd.to_timedelta(df['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())

我得到的结果是表 2 中的前两列。但是,无论变量“CAT”中的类别值如何,操作都会发生。如何对 CAT 中的每个值执行上述操作。

表 2

index           R   
0 days 04:52:00 -1  
0 days 04:53:00 -1  
0 days 04:54:00 -2
0 days 04:55:00 -2
0 days 04:56:00 -3
0 days 04:57:00 -5
0 days 04:58:00 -5
0 days 04:59:00 -5
0 days 05:00:00 -5
0 days 05:01:00 -5
0 days 05:02:00 -6
0 days 05:03:00 -6
0 days 05:04:00 -8
0 days 05:05:00 -8
0 days 05:06:00 -8
0 days 05:07:00 -10

【问题讨论】:

更快获得帮助的提示:提供代码以创建示例数据框,例如pd.DataFrame(...)。这样一来,更多人可以立即复制/粘贴,并花更多时间处理数据本身,而不是从您提供的文本输出中拼凑数据框。 @user17242583 谢谢。我做了建议的更改。 【参考方案1】:

你可以试试下面的代码:

df1.index=pd.to_timedelta(df['ET'])
df2.index=pd.to_timedelta(df['ST'])
df_final=df1.groupby(['CAT',pd.Grouper(freq='1Min')]).sum()['R'].fillna(0).subtract(df2.groupby(['CAT',pd.Grouper(freq='1Min')]).sum()['R'].fillna(0),fill_value=0).cumsum()
x = pd.DataFrame(df_final.reset_index())

CAT 列添加到groupby,它应该可以解决您的问题。

【讨论】:

以上是关于对另一列python中的每个类别执行多个groupby的主要内容,如果未能解决你的问题,请参考以下文章

如何对另一列的分组中的一列求和?

窗口函数:仅对另一列中的不同值求和

遍历列中的每个类别并将另一列中的值添加为单独的 df

如何按一列分组并对另一列的值进行排序?

Pyspark数据框:对一列求和,同时对另一列进行分组

获取基于另一列pandas python的分组值的百分比