Python 如何将切片应用于数据帧?
我的数据框中有大约500000个条目,我想对这些数据进行某种平滑处理,以显著减少条目的数量 这是一个示例数据帧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
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