2017-02-15 2 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によってグループエントリにしたい、と60秒(すなわち、[0; 60]のスライスウィンドウのSERVICE_TIMEの平均値を推定するために、[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の対応値を平均します。

どうすればこのスライスを行うことができますか?

平均を計算するだけで(スライスしない場合)、私はこのようにします。あなたは基本的にだけでなく['EVENT','GRADE']によってグループ分けのことを除いて、正しい考えを持っている

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

答えて

2

、あなたもSERVICE_GROUP GROUPBYしたいと思う:

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 

-1の中にある(df['SERVICE_TIME']-1)//60は、SERVICE_GROUPの部分を0にします。 そうでない場合、SERVICE_TIMES 40と60は一緒にグループ化されませんでした。

したがってdf['SERVICE_GROUP'] = (df['SERVICE_TIME']-1)//60は、あなたが(ここで「SERVICE_TIME_GROUP」)の窓に基づいて分割し、新たな列を生成することができます SERVICE_TIMEグループはハーフオープンの間隔

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

されます。この新しい列を使用してグループ化します。グループ化したら、それをドロップすることができます。 [0; 60]、[61; 120]、[121; 180]、[181; 240]の場合、ceil関数が機能します。特殊なケースの1つは0で、別々に処理する必要があります。それ以外の場合は、ウィンドウサイズで分割してください。グループを取得します。
0 => 1
1-60 => 1
61-120 => 2
121から180 => 3
...

関連する問題