2016-03-01 5 views
0

Я хотел бы создать сводную таблицу и использовать ее для нескольких aggfuncs; в частности np.mean и np.std. Нормальным поведением pandas.pivot_tables было бы размещение aggfuncs сверху иерархически. Если бы у вас был только один столбец в value, это не имело бы значения, но у меня есть 7. Это делает чтение таблицы немного утомительным. Я хотел бы иметь возможность размещать значения поверх иерархии, чтобы в каждом value был средний и std-столбец. Есть ли способ, которым это можно сделать, или я зов?pandas pivot table расположение

Спасибо за помощь!

Редактировать: Вот небольшая выдержка из данных.

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 

Я хочу, чтобы выход выглядеть следующим образом:

    Col 3  Col 4  Col 5  Col 6  Col 7 ... 
Col 1 Col 2 Mean Std Mean Std Mean Std Mean Std Mean Std ... 
A  A  0  0  2123.5 2173.5 ... 
     B  ... 
     C  ... 

Я не собираюсь бегать по всему Calcs прямо сейчас, но я думаю, что получает через точку, как это вопрос форматирования ,

+0

Что вы можете сделать, это использовать GroupBy функцию. Это возвращает словарь. Затем используйте собственный метод печати со словарем. Вы можете использовать методы .mean() и .std(). Пожалуйста, покажите данные и нужный макет. – Merlin

+0

@merlin Я добавил некоторые данные и желаемый макет – Grr

+0

@Merlin Только что вернулся, чтобы рассмотреть его. Вот и все. Должен был прочитать весь путь через документы groupby. Благодаря! – Grr

ответ

1

я должен был изменить свои строки заголовков от "Col 1" >> "COL1"

import pandas as pd 

df=pd.read_clipboard() 

df 

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 




    In [9]: import numpy as np 

In [10]: np.round(df.groupby(['Col1', 'Col2']).agg(['mean', 'std']),4) 
Out[10]: 
       Col3    Col4    Col5    Col6 \ 
       mean  std mean  std mean  std mean 
Col1 Col2 
A A   0.0 0.0000 2123.5 3003.0825 4025.0 2346.1803 3113.5 
    B  18013.5 260.9224  0.0  0.0000 1904.5 1117.9358 2118.5 
    C  18352.0  NaN  0.0  NaN 3545.0  NaN 7508.0 

         Col7    Col8    Col9 
       std mean  std mean  std mean   std 
Col1 Col2 
A A  1478.5603 1774 1953.0289 466.5 324.562 8313.5 11274.8176 
    B  350.0179 4580 1148.3414 1621.5 470.226 600.0 219.2031 
    C   NaN 5099  NaN 2071.0  NaN 1239.0   NaN 
0

Я думаю, что это можно решить, используя комбо .describe() (который имеет как средние, так и std-статистики) и .pivot. Скажем, у вас есть DF, который выглядит следующим образом:

print(df) 

     City   Country     lon 
0  Dubai   United Arab Emirates 55.307484 
254  Buenos Aires Argentina    -58.381592 
1002 Rosario  Argentina    -60.666500 
1162 Punta Arenas Chile     -70.916473 
1178 San Miguel Argentina    -65.217590 

и вы хотите, чтобы получить статистику в столбце «Lon» для каждой страны. Используйте .describe чтобы получить статистику:

stats = df.groupby('Country').describe() 
#reset index so that you can specify the columns later 
stats.reset_index(level = [0,1], inplace = True) 
stats.head() 
    Country level_1 lon 
0 Albania count 1.0000 
1 Albania mean 19.8318 
2 Albania std  NaN 
3 Albania min  19.8318 
4 Albania 25%  19.8318 

Затем сделайте сводную таблицу, основанную на таблице статистики. Так как результат будет несколько индексируется, вам необходимо указать кортежей столбцы для доступа средних и StD столбцов:

stats.pivot('Country', 'level_1')[[('lon', 'mean'), ('lon', 'std')]] 

результат будет что-то вроде:

lon 
level_1 mean std 
Country  
Albania 19.831800 NaN 
Algeria 2.744837 3.323134 
Angola 13.234444 NaN 
Argentina -63.806806 4.101027 

Позвольте мне знать, если это помогает --удачи.

+0

У меня есть некоторые проблемы с реализацией этого в моем формате. Когда скрипт переходит в 'stats.pivot'. В моем случае stats.head() не имеет метки для столбца дескриптора статистики, его просто пустое. Поэтому я не уверен, как вызвать его в столбце 'columns =' для stats.pivot (index, columns). – Grr

+0

Для этого используется строка 'reset_index'. В основном, когда вы запустите функцию .describe(), она устанавливает столбец статистики как индекс. Итак, если вы это сделали, как в моем примере, .reset_index (level = [0,1], inplace = True), это может не сработать, если у вас больше/меньше указателей, чем у моего оригинального DF. У меня было два указателя (столбец Страна и статистика), поэтому два элемента в elvels arg. Поэтому попробуйте сыграть с цифрами, которые вы ввели в аргумент уровня. – Sam

+0

Я попытался реализовать это с помощью функции stats.reset_index, но теперь я получаю значение ValueError: Length Mismatch.The, который я пытаюсь использовать, - это статистика.pivot (['Col 1', 'Col 2'], 'level_2') [column_tuples] 'column_tuples - это список (col name, mean), (col name, std) tuples – Grr

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