【问题标题】:pandas Calculating ratio as values in pivot table大熊猫计算比率作为数据透视表中的值
【发布时间】:2023-03-30 11:02:01
【问题描述】:

我有一个如下所示的 Df:

    tests  Machine  results
    111    A        OK
    111    A        OK
    111    A        OK
    111    A        NOK
    111    B        OK
    222    A        OK
    333    A        OK
    333    B        OK
    444    A        OK
    222    A        NOK
    222    A        OK
    111    B        OK

我想要一个矩阵/数据透视表,其中行应该是测试,列应该是机器,值应该是测试的比率/百分比,这对每台机器的测试总数来说是可以的。

结果应该是:

   OK/total cnt  A     B
   111           75%   100%   #test 111 passed 3 out of 4 tests in machine A and all tests in B
   222           50%   0%     #test 222 passed 1 out of 2 tests in machine A and 0 tests prfrmd in B
   333           100%  100%   #test 333 passed all tests in A and B machines

请帮帮我。

【问题讨论】:

    标签: python pandas pivot-table crosstab


    【解决方案1】:

    获取等于 OK 的行的列,然后运行 ​​crosstab 以获取平均值

    df = df.assign(passed=df.results.eq("OK"))
    
    (
        pd.crosstab(df.tests, df.Machine, df.passed, aggfunc="mean")
        .rename_axis(columns=None, index="OK/total cnt")
        .mul(100, fill_value=0)
    )
    
                      A           B
    OK/total cnt        
      111           75.000000   100.0
      222           66.666667   0.0
      333          100.000000   100.0
      444          100.000000   0.0
    

    【讨论】:

      【解决方案2】:

      通过DataFrame.assign 创建新列,并通过Series.eq 比较OK,然后在DataFrame.pivot_table 中默认旋转mean 方法,通过100 倍增,最后在必要时将索引转换为column

      df = (df.assign(res = df['results'].eq('OK'))
              .pivot_table(index='tests',
                           columns='Machine', 
                           values='res', 
                           fill_value=0)
              .mul(100)
              .rename_axis(index='OK/total cnt', columns=None)
              .reset_index())
      print (df)
         OK/total cnt           A    B
      0           111   75.000000  100
      1           222   66.666667    0
      2           333  100.000000  100
      3           444  100.000000    0
      

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 2017-06-18
        • 2021-02-06
        • 2017-03-11
        • 1970-01-01
        • 2021-02-28
        • 2023-01-11
        • 1970-01-01
        相关资源
        最近更新 更多