2017-02-15 36 views
0

我的數據框中有大約500,000個條目,我想對這些數據應用某種平滑處理,以顯着減少條目數量。如何將切片應用於數據框?

這是一個示例數據幀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 

目的是減少的SERVICE_TIMEQUEUE_TIMEHOLD_TIME的粒度。

要做到這一點,我想組條目由EVENTGRADE,以及估計的SERVICE_TIME平均值爲60秒(即,[0; 60]的片窗口,[61; 120],[121; 180 ],[181; 240]等等,直到最大值爲SERVICE_TIME)。切片窗口的大小可以靈活地從60更改爲任何其他值,這一點很重要。 所以,切片應該適用於SERVICE_TIME,而其他列QUEUE_TIMEQUEUE_TIME應該相應地被平均。

樣品結果:

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 

所以,SERVICE_TIME,170和172的兩個值,被合併,因爲它們都屬於切片窗口[121; 180]。所以我計算了平均值171,然後我只是平均了QUEUE_TIMEHOLD_TIME的相應值。

我該如何切片?

如果我不得不計算平均值(沒有切片),那麼我會這樣做。

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

回答

2

你基本上由剛['EVENT','GRADE']有正確的想法,只是代替分組,你要還GROUPBY SERVICE_GROUP

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

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'EVENT': ['AAA', 'AAA', 'AAA', 'AAA', 'BBB', 'BBB'], 
'GRADE': [3, 4, 3, 3, 5, 5], 
'HOLD_TIME': [12, 10, 12, 10, 10, 8], 
'QUEUE_TIME': [20, 15, 24, 5, 10, 10], 
'SERVICE_TIME': [170, 165, 172, 105, 40, 60]}) 

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

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

打印

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 

(df['SERVICE_TIME']-1)//60中的-1使得SERVICE_GROUP的60部分爲0. 否則,SERVICE_TIMES 40和60不會被分組在一起。

因此df['SERVICE_GROUP'] = (df['SERVICE_TIME']-1)//60導致 SERVICE_TIME羣體是半開區間

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

您可以生成,其將基於窗口的新列(這裏「SERVICE_TIME_GROUP」)。然後使用這個新列進行分組。分組後,你可以放下它。

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
...

相關問題