Python pandas透视表展示一个由两列计算得出的衍生指标

3

我是Python的新手。我会尽力提供足够的细节。

我的数据框:

df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                      'company': ['A', 'A', 'A', 'A', 'A','B','B','B','B','B'],
                      'bin1': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
                      'bin2': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
                      'offered': [10, 15, 25, 30, 20, 5, 40, 50, 55, 0],
                      'accepted': [5, 10, 20, 25, 15, 5, 20, 5, 30, 0]})

    id  company bin1    bin2   offered  accepted
0   1   A       1       1      10       5
1   2   A       2       2      15       10
2   3   A       3       3      25       20
3   4   A       1       1      30       25
4   5   A       2       2      20       15
5   6   B       3       3      5        5
6   7   B       1       1      40       20
7   8   B       2       2      50       5
8   9   B       3       3      55       30
9   10  B       1       1      0        0


我想创建一个数据透视表,显示:

- index=['company','bin1']
- columns=['bin2']
- three metrices: sum(offered), sum(accepted), accept_rate (formula = accepted divided by offered)

我所知道的方法只有这个:
df.pivot_table(values=['accepted','offered'], index=['company','bin1'], columns=['bin2'], aggfunc=[np.sum])

               sum
               accepted         offered
bin2           1    2    3      1    2    3
company bin1                        
A      1       30.0 NaN  NaN    40.0 NaN  NaN
       2       NaN  25.0 NaN    NaN  35.0 NaN
       3       NaN  NaN  20.0   NaN  NaN  25.0
B      1       20.0 NaN  NaN    40.0 NaN  NaN
       2       NaN  5.0  NaN    NaN  50.0 NaN
       3       NaN  NaN  35.0   NaN  NaN  60.0

我该如何添加第三个指标(即accept_rate)?理想情况下,我希望将这三个指标并排显示。

               sum
               accepted         offered          accept_rate
bin2           1    2    3      1    2    3      1      2       3
company bin1                        
A      1       30.0 NaN  NaN    40.0 NaN  NaN    0.75   NaN     NaN
       2       NaN  25.0 NaN    NaN  35.0 NaN    NaN    0.714   NaN
       3       NaN  NaN  20.0   NaN  NaN  25.0   NaN    NaN     0.8
B      1       20.0 NaN  NaN    40.0 NaN  NaN    0.5    NaN     NaN
       2       NaN  5.0  NaN    NaN  50.0 NaN    NaN    0.1     NaN
       3       NaN  NaN  35.0   NaN  NaN  60.0   NaN    NaN     0.58


请注意:offeredaccepted 在最后一行 / 观察中均设为 0。真实数据也将有 0。因此,在 df 中添加一个新列 (accepted/offered),然后使用 aggfunc=np.mean 将不起作用。
提前感谢您!
1个回答

1

有趣的是你可以在第二步获得它

>>> df1['sum']['accepted'] / df1['sum']['offered']
bin2             1         2         3
company bin1
A       1     0.75       NaN       NaN
        2      NaN  0.714286       NaN
        3      NaN       NaN  0.800000
B       1     0.50       NaN       NaN
        2      NaN  0.100000       NaN
        3      NaN       NaN  0.583333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接