Python 如何将切片应用于数据帧?

Python 如何将切片应用于数据帧?,python,pandas,Python,Pandas,我的数据框中有大约500000个条目,我想对这些数据进行某种平滑处理,以显著减少条目的数量 这是一个示例数据帧df: EVENT GRADE SERVICE_TIME QUEUE_TIME HOLD_TIME AAA 3 170 20 12 AAA 4 165 15 10 AAA 3 172 24

我的数据框中有大约500000个条目,我想对这些数据进行某种平滑处理,以显著减少条目的数量

这是一个示例数据帧
df

EVENT   GRADE   SERVICE_TIME   QUEUE_TIME   HOLD_TIME
AAA     3       170            20           12
AAA     4       165            15           10
AAA     3       172            24           12
AAA     3       105            5            10
BBB     5       40             10           10
BBB     5       60             10           8
目标是减少
服务时间
队列时间
等待时间
的粒度

为此,我想按
事件
等级
对条目进行分组,并估计
服务时间
在60秒的切片窗口中的平均值(即[0;60]、[61;120]、[121;180]、[181;240],等等,直到
服务时间的最大值
)。重要的是,切片窗口的大小可以灵活地从60更改为任何其他值。 因此,切片应应用于
服务时间
,而其他列
队列时间
队列时间
应相应地取平均值

示例结果:

EVENT   GRADE   SERVICE_TIME   QUEUE_TIME   HOLD_TIME
AAA     3       171            22           12
AAA     3       105            5            10
AAA     4       165            15           10
BBB     5       50             10           9
因此,
服务时间
的两个值170和172被合并,因为它们都属于切片窗口[121;180]。因此,我计算了平均值
171
,然后对
QUEUE\u TIME
HOLD\u TIME
的对应值进行平均

我怎么做这个切片

如果我必须计算一个平均值(没有切片),那么我会这样做

result = df.groupby(['EVENT','GRADE']).agg({'SERVICE_TIME': 'mean', 
                                            'QUEUE_TIME': 'mean', 
                                            'HOLD_TIME': 'mean'}).reset_index() 

您的想法基本上是正确的,除了不只是按
['EVENT','GRADE']
分组之外,您还需要按
服务组分组

df['SERVICE_GROUP'] = (df['SERVICE_TIME']-1)//60

印刷品

  EVENT  GRADE  QUEUE_TIME  SERVICE_TIME  HOLD_TIME
0   AAA      3           5           105         10
1   AAA      3          22           171         12
2   AAA      4          15           165         10
3   BBB      5          10            50          9

中的-1(df['SERVICE\u TIME']-1)//60
构成
SERVICE\u组的60部分
0。 否则,
SERVICE\u时间
40和60将不会被分组在一起

因此,
df['SERVICE\u GROUP']=(df['SERVICE\u TIME']-1)//60
导致
保养时间
分组为半开间隔

(1, 60], (60, 120], (120, 180], ...

您的想法基本上是正确的,除了不只是按
['EVENT','GRADE']
分组之外,您还需要按
服务组分组

df['SERVICE_GROUP'] = (df['SERVICE_TIME']-1)//60

印刷品

  EVENT  GRADE  QUEUE_TIME  SERVICE_TIME  HOLD_TIME
0   AAA      3           5           105         10
1   AAA      3          22           171         12
2   AAA      4          15           165         10
3   BBB      5          10            50          9

中的-1(df['SERVICE\u TIME']-1)//60
构成
SERVICE\u组的60部分
0。 否则,
SERVICE\u时间
40和60将不会被分组在一起

因此,
df['SERVICE\u GROUP']=(df['SERVICE\u TIME']-1)//60
导致
保养时间
分组为半开间隔

(1, 60], (60, 120], (120, 180], ...

您可以生成一个基于窗口划分的新列(此处为“服务\u时间\u组”)。然后使用此新列进行分组。分组后,您可以将其删除

WINDOW = 60
df['SERVICE_TIME_GROUP'] = df['SERVICE_TIME'].apply(lambda x : 1 if x==0 else math.ceil(x/(WINDOW*1.0));

result = df.groupby(['EVENT','GRADE','SERVICE_TIME_GROUP']).agg({'SERVICE_TIME': 'mean', 
                                            'QUEUE_TIME': 'mean', 
                                            'HOLD_TIME': 'mean'}).reset_index() 

result = result.drop('SERVICE_TIME_GROUP', 1)
对于[0;60]、[61;120]、[121;180]、[181;240],ceil函数将起作用。一个特殊情况是0,需要单独处理。否则,只需除以窗口大小并将其分隔,您将得到一个组。
0=>1
1-60=>1
61-120=>2
121-180=>3

您可以生成一个基于窗口划分的新列(此处为“服务时间组”)。然后使用此新列进行分组。分组后,您可以将其删除

WINDOW = 60
df['SERVICE_TIME_GROUP'] = df['SERVICE_TIME'].apply(lambda x : 1 if x==0 else math.ceil(x/(WINDOW*1.0));

result = df.groupby(['EVENT','GRADE','SERVICE_TIME_GROUP']).agg({'SERVICE_TIME': 'mean', 
                                            'QUEUE_TIME': 'mean', 
                                            'HOLD_TIME': 'mean'}).reset_index() 

result = result.drop('SERVICE_TIME_GROUP', 1)
对于[0;60]、[61;120]、[121;180]、[181;240],ceil函数将起作用。一个特殊情况是0,需要单独处理。否则,只需除以窗口大小并将其分隔,您将得到一个组。
0=>1
1-60=>1
61-120=>2
121-180=>3