Как отобразить результаты панд после агрегирования pivot_table? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть некоторые данные тестов, пройденных так:

import numpy as np
import pandas as pd

data = [[np.random.choice(['Tmax', 'Tmin']), np.random.choice(['USA', 'FRA', 'AUS']),
         np.random.randint(1,4), np.random.choice(['Class A', 'Class B']),np.random.randint(4)] for i in range(1000)]
df = pd.DataFrame(data, columns=['temp', 'region', 'method', 'slice', 'pass'])

Я повернул кадр данных с помощью функции np.mean следующим образом:

pv = pd.pivot_table(df, 
               index=['temp', 'method'], 
               values=['pass'],
               columns=['slice', 'region'],
              aggfunc=(np.mean))

Значения переменной 'pass' - это среднее значение пройденных тестов в виде десятичных дробей, таких как 0,45, 1,5, 3,2 ..., однако я хочу отобразить эти результаты с помощью следующей функции

def results_mapper(v):
    num_tests = np.round(v)
    if num_tests < 2:
        return 1
    elif num_tests == 2:
        return 2
    else:
        return 3

Я пытался отобразить результаты, используя pv.map(results_mapper) или map(results_mapper, pv), но безуспешно.

Номера образцов: pv выходные значения могут быть как 0.5, 1.1, 1.49, 1.6, 1.9, 2.1, 2.9, 3.5

будет сопоставлен с 1, 1, 1, 2, 2, 2, 3, 3

Как я могу применить функцию отображения к своим результатам, сохранив формат сводной таблицы как есть?

1 Ответ

0 голосов
/ 03 сентября 2018

Использование np.vectorize

func = np.vectorize(results_mapper)
pv.values[:,:] = func(pv.values)

Выход

              pass                            
slice       Class A           Class B          
region          AUS  FRA  USA     AUS  FRA  USA
temp method                                    
Tmax 1          1.0  1.0  2.0     2.0  2.0  1.0
     2          1.0  2.0  1.0     1.0  1.0  1.0
     3          1.0  2.0  2.0     2.0  2.0  2.0
Tmin 1          2.0  1.0  2.0     2.0  1.0  2.0
     2          2.0  2.0  1.0     2.0  1.0  2.0
     3          2.0  1.0  1.0     2.0  2.0  1.0
...