2017-01-30 2 views
3

У меня есть следующие данные:Как группировать строки и извлекать средние значения

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 

Я хочу, чтобы вычислить среднее TOTAL_SERVICE_TIME и TOTAL_WAIT_TIME для каждого типа QUEUE (ABC123, DEF656, FED456) в течение часа.

Результат должен быть такой:

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_TIME и TOTAL_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

Я думаю, вам нужно первым изменить свои данные по melt или lreshape:

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 

Тогда groupby с mean и последним reindex по MultiIndex созданных из unique значений столбцов QUEUE и HOUR:

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

У меня все еще есть одно сомнение. Вы имеете в виду, что я должен сначала выполнить свой код, чтобы получить «результат», а затем выполнить ваш? Мой исходный фреймворк называется 'df', но я вижу только« результат »в вашем коде. Извините, я не очень хорошо объяснил это в начале. – Dinosaurius

1

шаги:

1) Используйте pd.lreshape для преобразования DF от широкоугольных до длинного формата для имен столбцов, начиная с QUEUE_X и именем, что благотворный колонок, как ОЧЕРЕДИ.

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

Смежные вопросы