我有一个看起来像这样的数据框。

我唯一没有的就是“重量百分比”。我需要它从其各自的总和中取回每个收益的权重(以总和为准)。

结构不一致。有时可能会有3个类别针对特定月份的帐户进行总计,有时可能会有4或5。

我需要遍历“每月MV列”,找到每个类别在其月份总数中的权重。

目前看起来像这样:

Return Date    Account    Category    Monthly MV
 7/31/2003      abcdef     BOND        1.00
 7/31/2003      abcdef     CASH        0.50
 7/31/2003      abcdef     EQUITY      1.50
 7/31/2003      abcdef     TOTAL       3.00
 8/30/2003      abcdef     ALT         1.00
 8/30/2003      abcdef     BOND        1.00
 8/30/2003      abcdef     CASH        0.25
 8/30/2003      abcdef     EQUITY      2.50
 8/30/2003      abcdef     REAL        0.25
 8/30/2003      abcdef     TOTAL       5.00


它看起来应该像这样:

Return Date    Account    Category    Monthly MV    % of Weight
 7/31/2003      abcdef     BOND        1.00          0.33333
 7/31/2003      abcdef     CASH        0.50          0.1667
 7/31/2003      abcdef     EQUITY      1.50          0.5
 7/31/2003      abcdef     TOTAL       3.00          1.00
 8/30/2003      abcdef     ALT         1.00          0.20
 8/30/2003      abcdef     BOND        1.00          0.20
 8/30/2003      abcdef     CASH        0.25          0.05
 8/30/2003      abcdef     EQUITY      2.50          0.5
 8/30/2003      abcdef     REAL        0.25          0.05
 8/30/2003      abcdef     TOTAL       5.00          1.00

最佳答案

IIUC,您可以回填TOTAL行并简单地划分:

df['% of Weight'] = df['Monthly MV'].div(df['Monthly MV']
                                         .where(df['Category'].eq('TOTAL'))
                                         .bfill()
                                        )


输出:

  Return Date Account Category  Monthly MV  % of Weight
0   7/31/2003  abcdef     BOND        1.00     0.333333
1   7/31/2003  abcdef     CASH        0.50     0.166667
2   7/31/2003  abcdef   EQUITY        1.50     0.500000
3   7/31/2003  abcdef    TOTAL        3.00     1.000000
4   8/30/2003  abcdef      ALT        1.00     0.200000
5   8/30/2003  abcdef     BOND        1.00     0.200000
6   8/30/2003  abcdef     CASH        0.25     0.050000
7   8/30/2003  abcdef   EQUITY        2.50     0.500000
8   8/30/2003  abcdef     REAL        0.25     0.050000
9   8/30/2003  abcdef    TOTAL        5.00     1.000000

10-02 18:41