代码之家  ›  专栏  ›  技术社区  ›  Mohammad ElNesr

如何映射数据透视表聚合后的结果?

  •  0
  • Mohammad ElNesr  · 技术社区  · 6 年前

    我有一些通过测试的数据如下:

    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' variable是以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 回复  |  直到 6 年前
        1
  •  2
  •   Yuca    6 年前

    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