メイン インデックスに 3 つのレベルを持つ DataFrame があります。
from pandas import *
df_multi = DataFrame(np.random.rand(6,2), index = [['CF', 'CF', 'CF', 'DA', 'DA','DA'], ['x', 'y', 'y', 'x', 'y', 'y'], ['a', 'b', 'a', 'a', 'a', 'b']], columns = ['PC1', 'PC2'])
df_multi.index.names =['l1','l2','l3']
In [5]: df_multi
Out[5]:
PC1 PC2
l1 l2 l3
CF x a 0.118061 0.473159
y b 0.159534 0.407676
a 0.466731 0.163322
DA x a 0.152799 0.333438
y a 0.632725 0.965348
b 0.737112 0.834592
ここで、第 3 レベルで合計し、各要素を対応する合計で割って、第 3 レベルでのシェアを取得します (たとえば(CF, x, a)
、(CF, x, a)
と(CF, y, a)
で割る(CF, y, a) + (CF, y, b)
など)。
In [6]: df_multi.sum(level = [0, 1])
Out[6]:
PC1 PC2
l1 l2
CF x 0.118061 0.473159
y 0.626265 0.570998
DA x 0.152799 0.333438
y 1.369837 1.799940
と
df_multi_share = df_multi.div(df_multi.sum(level = [0, 1]), level=[0, 1])
ただし、これは機能しません。私は、パーセンテージ シェアの計算に限定されない、複数のレベルでの算術マッチングを可能にする一般的なソリューションを探しています。たとえば、1つのレベルのみを使用する場合は機能します
df_multi = DataFrame(np.random.rand(4,2), index = [['CF', 'CF', 'DA', 'DA'], ['1', '2', '1', '2']], columns = ['PC1', 'PC2'])
df_single = DataFrame(np.random.rand(3,3), index = ['1', '2', '3'], columns = ['PC1', 'PC2', 'PC3'])
df_combined = df_multi.mul(df_single, level = 1)