2017-01-30 4 views
3

を抽出します。私は時間にわたりQUEUEABC123DEF656FED456)の種類ごとに平均TOTAL_SERVICE_TIMETOTAL_WAIT_TIMEを計算したいどのグループ行をすると、私は、次のデータ持っている平均値に

df = 
    QUEUE_1 QUEUE_2 QUEUE_3 HOUR TOTAL_SERVICE_TIME TOTAL_WAIT_TIME 
    ABC123 DEF656    7  20     30 
    ABC123      7  22     32 
    DEF656 ABC123 FED456 8  15     12 
    FED456 DEF656    8  15     16 

を。

結果はこのようになります。

result = 
    QUEUE HOUR AVG_TOT_SERVICE_TIME AVG_TOT_WAIT_TIME 
    ABC123 7  21      31 
    ABC123 8  15      12 
    DEF656 7  20      30 
    DEF656 8  15      14 
    FED456 7  0      0 
    FED456 8  15      14 

これは私の現在のコードですが、期待どおりの結果が得られていないようです。特に、HOURの値は順序付けされておらず、TOTAL_SERVICE_TIMETOTAL_WAIT_TIMEの平均値は正しく計算されていません。

cols = ['QUEUE', 'HOUR', 'TOTAL_SERVICE_TIME', 'TOTAL_WAIT_TIME'] 
result = pd.melt(
    df, ['HOUR', 'TOTAL_SERVICE_TIME', 'TOTAL_WAIT_TIME'], 
    ['QUEUE_1', 'QUEUE_2', 'QUEUE_3'], 
    value_name='QUEUE')[cols] 

答えて

2

私はあなたが最初meltlreshapeしてデータを再構築が必要だと思う:

result = pd.lreshape(df, {'QUEUE': ['QUEUE_1','QUEUE_2','QUEUE_3']}) 
print (result) 
    HOUR TOTAL_SERVICE_TIME TOTAL_WAIT_TIME QUEUE 
0  7     20    30 ABC123 
1  7     22    32 ABC123 
2  8     15    12 DEF656 
3  8     15    16 FED456 
4  7     20    30 DEF656 
5  8     15    12 ABC123 
6  8     15    16 DEF656 
7  8     15    12 FED456 

次に列QUEUEHOURunique値から作成MultiIndexによってmeanと最後reindexgroupby

mux = pd.MultiIndex.from_product([result.QUEUE.dropna().unique(), 
            result.dropna().HOUR.unique()], names=['QUEUE','HOUR']) 

print (result.groupby(['QUEUE','HOUR']) 
      .mean() 
      .reindex(mux, fill_value=0) 
      .add_prefix('AVG_') 
      .reset_index()) 

    QUEUE HOUR AVG_TOTAL_SERVICE_TIME AVG_TOTAL_WAIT_TIME 
0 ABC123  7      21     31 
1 ABC123  8      15     12 
2 DEF656  7      20     30 
3 DEF656  8      15     14 
4 FED456  7      0     0 
5 FED456  8      15     14 
+0

感謝。 'FED456'を' HOUR'に7にするにはどうすればいいですか?このような場合、 'TOTAL_SERVICE_TIME'と' TOTAL_WAIT_TIME'の値は0に等しくなければなりません。 – Dinosaurius

+0

また、「KeyError: 'QUEUE」というエラーが表示されます。元のデータフレームに 'QUEUE_1'、' QUEUE_2'、 'QUEUE_3'があることに注意してください。この例で示したように、一意の値を持つ一意の列「QUEUE」を取得したいと考えています。 – Dinosaurius

+0

私はまだ疑いが1つあります。 'result'を取得してからあなたのコードを実行するために、まずコードを実行する必要がありますか?私のオリジナルのデータフレームは 'df'と呼ばれていますが、コード内には' result'しかありません。申し訳ありませんが、私は最初にそれをうまく説明していません。 – Dinosaurius

1

手順:

1)QUEUE_Xと名前で始まるpd.lreshapeは、列名、長い形式に広いからDFを変換するために使用することをQUEUEとして健全列。

2)DFをピボットします。pivot_tableを使用します。これはデフォルトで集約関数としてnp.meanを使用します。オプションで、欠損値を0で埋めてください。

3)得られたDFをスタックして、インデックスがマルチインデックス形式になるようにします。 char接頭辞を追加し、インデックスをリセットします。


df = pd.lreshape(df, {'QUEUE': df.columns[df.columns.str.startswith('QUEUE')].tolist()}) 
piv_df = df.pivot_table(index=['QUEUE'], columns=['HOUR'], fill_value=0) 
piv_df.stack().add_prefix('AVG_').reset_index() 

enter image description here

関連する問題