将 Dataframe Multiindex 级别 1 除以级别 0 的总和

Divide Dataframe Multiindex level 1 by the sum of level 0

我创建了一个这样的 DataFrame:

df = pd.DataFrame(
    {
        'env': ['us', 'us', 'us', 'eu'],
        'name': ['first', 'first', 'first', 'second'],
        'default_version': ['2.0.1','2.0.1','2.0.1', '2.1.1'],
        'version': ['2.2.1', '2.2.2.4', '2.3', '2.2.24'],
        'count_events': [1, 8, 102, 244],
        'unique_users': [1, 3, 72, 111]
    }
    )
df = df.pivot_table(index=['env', 'name', 'default_version'], \
    columns='version', values=['count_events', 'unique_users'], aggfunc=np.sum)

接下来我要查找的是在 level=1 处查找所有 count_events 的总和以及在 level=1 处查找所有 unique_users 的总和,因此我可以找到 [=20= 的百分比] 和每个版本中的 unique_users。

我已经用下面的代码生成了总和,但我不知道如何生成 %。

sums = df.sum(level=0, axis=1)
sums.columns = pd.MultiIndex.from_product([sums.columns, ['SUM']])
final_result = pd.concat([df, sums], axis=1)  

如有必要,更改和代码不会有问题。

您可以使用 reindex and set_axis:

的组合重新索引总和以匹配原始数据的形状
In [14]: fraction = (
    ...:     df / (
    ...:         sums
    ...:         .reindex(df.columns.get_level_values(0), axis=1)
    ...:         .set_axis(df.columns, axis=1)
    ...:     )
    ...: ).fillna(0)

In [15]: fraction
Out[15]:
                           count_events                            unique_users
version                           2.2.1   2.2.2.4 2.2.24       2.3        2.2.1   2.2.2.4 2.2.24       2.3
env name   default_version
eu  second 2.1.1               0.000000  0.000000    1.0  0.000000     0.000000  0.000000    1.0  0.000000
us  first  2.0.1               0.009009  0.072072    0.0  0.918919     0.013158  0.039474    0.0  0.947368