Python Pandas:根据百分比将数据框中的总值分布回类别

Python Pandas: Spread total values in dataframe based on percentages back to categories

我有以下数据框,我想根据百分比列中的百分比将 val 列中的总值分布回 Cat 列。

    Country State   City    Cat Total amount    Percentage  val1    val2    val3    val4

    US        FL    MIA     cat1     100           10 
    US        FL    MIA     cat2     850           85
    US        FL    MIA     cat3     50            5
    US        FL    MIA     tot cat  1000          100      200       30    400     120
    US        GA    ATL     cat1     200           40       
    US        GA    ATL     cat2     300           60       
    US        GA    ATL     tot cat  500           100      100       50    20      30
    US        NY    NY      tot cat  100           100      0         20    5       15
    Canada    MB    WPG     cat1     250           50
    Canada    MB    WPG     cat2     250           50
    Canada    MB    WPG     tot cat  500           100      50        550   40      160
    Canada    QC    YUL     cat1     500           33,33
    Canada    QC    YUL     cat2     1000          66,66
    Canada    QC    YUL     tot cat  1500          100      1000      250   500     60

我得到了总行,我还设法输入了每组的百分比,并根据几列合并了两个数据框,但现在我卡住了……

期望的输出:

    Country State   City    Cat Total amount    Percentage  val1    val2    val3    val4

    US        FL    MIA     cat1     100           10       20        3     40      12
    US        FL    MIA     cat2     850           85       170       25,5  340     102
    US        FL    MIA     cat3     50            5        10        1,5   20      6
    US        FL    MIA     tot cat  1000          100      200       30    400     120
    US        GA    ATL     cat1     200           40       40        20    8       12      
    US        GA    ATL     cat2     300           60       60        30    12      18      
    US        GA    ATL     tot cat  500           100      100       50    20      30
    US        NY    NY      tot cat  100           100      0         20    5       15
    Canada    MB    WPG     cat1     250           50       25        275   20      80
    Canada    MB    WPG     cat2     250           50       25        275   20      80
    Canada    MB    WPG     tot cat  500           100      50        550   40      160
    Canada    QC    YUL     cat1     500           33,33    333,33    83,32 166,65  19,99   
    Canada    QC    YUL     cat2     1000          66,66    666,66    166,65333,33  39,99
    Canada    QC    YUL     tot cat  1500          100      1000      250   500     60

或者我应该在合并时计算/散布这些值吗?我需要帮助...

编辑:我提供了输入数据。

    pd.DataFrame([{'Country': 'US', 'State': 'FL', 'City': 'MIA', 'Cat': 'cat1', 'Total Amount': 100, 'Percentage': 10 }, 
        {'Country': 'US', 'State': 'FL', 'City': 'MIA', 'Cat': 'cat2','Total Amount': 850, 'Percentage': 85 },
        {'Country': 'US', 'State': 'FL', 'City': 'MIA', 'Cat': 'cat3','Total Amount': 50, 'Percentage': 5 },
        {'Country': 'US', 'State': 'FL', 'City': 'MIA', 'Cat': 'Tot Cat','Total Amount': 1000, 'Percentage': 100, 'val1': 200, 'val2': 30, 'val3': 400, 'val4': 120},
        {'Country': 'US', 'State': 'GA', 'City': 'ATL', 'Cat': 'cat1','Total Amount': 200, 'Percentage': 40 },
        {'Country': 'US', 'State': 'GA', 'City': 'ATL', 'Cat': 'cat2','Total Amount': 300, 'Percentage': 60 },
        {'Country': 'US', 'State': 'GA', 'City': 'ATL', 'Cat': 'Tot Cat','Total Amount': 500, 'Percentage': 100, 'val1': 100, 'val2': 50, 'val3': 20, 'val4': 30},
        {'Country': 'US', 'State': 'NY', 'City': 'ATL', 'Cat': 'Tot Cat','Total Amount': 100, 'Percentage': 100, 'val1': 0, 'val2': 20, 'val3': 5, 'val4': 15},
        {'Country': 'Canada', 'State': 'MB', 'City': 'WPG', 'Cat': 'cat1', 'Total Amount': 250, 'Percentage': 50 },
        {'Country': 'Canada', 'State': 'MB', 'City': 'WPG', 'Cat': 'cat2', 'Total Amount': 250, 'Percentage': 50 },
        {'Country': 'Canada', 'State': 'MB', 'City': 'WPG', 'Cat': 'Tot Cat', 'Total Amount': 500, 'Percentage': 100, 'val1': 50 , 'val2': 550, 'val3': 40, 'val4': 160},
        {'Country': 'Canada', 'State': 'QC', 'City': 'YUL', 'Cat': 'cat1', 'Total Amount': 500, 'Percentage': 33.33 },
        {'Country': 'Canada', 'State': 'QC', 'City': 'YUL', 'Cat': 'cat2', 'Total Amount': 1000, 'Percentage': 66.66 },
        {'Country': 'Canada', 'State': 'QC', 'City': 'YUL', 'Cat': 'Tot Cat', 'Total Amount': 1500, 'Percentage': 100, 'val1': 1000 , 'val2': 250, 'val3': 500, 'val4': 60 }])

不知道你是否可以更优雅地做到这一点,但你可以这样做:

>>> df_tot = df[df['Cat'] == 'tot cat'].reindex(index=df.index, method='backfill')
>>> for x in df.columns:
        if 'val' in x:
            df[x] = df['Percentage'] * df_tot[x] / 100

   Country State City      Cat  Total_amount  Percentage    val1     val2    val3     val4
0       US    FL  MIA     cat1           100       10.00    20.0    3.000   40.00   12.000
1       US    FL  MIA     cat2           850       85.00   170.0   25.500  340.00  102.000
2       US    FL  MIA     cat3            50        5.00    10.0    1.500   20.00    6.000
3       US    FL  MIA  tot cat          1000      100.00   200.0   30.000  400.00  120.000
4       US    GA  ATL     cat1           200       40.00    40.0   20.000    8.00   12.000
5       US    GA  ATL     cat2           300       60.00    60.0   30.000   12.00   18.000
6       US    GA  ATL  tot cat           500      100.00   100.0   50.000   20.00   30.000
7       US    NY   NY  tot cat           100      100.00     0.0   20.000    5.00   15.000
8   Canada    MB  WPG     cat1           250       50.00    25.0  275.000   20.00   80.000
9   Canada    MB  WPG     cat2           250       50.00    25.0  275.000   20.00   80.000
10  Canada    MB  WPG  tot cat           500      100.00    50.0  550.000   40.00  160.000
11  Canada    QC  YUL     cat1           500       33.33   333.3   83.325  166.65   19.998
12  Canada    QC  YUL     cat2          1000       66.66   666.6  166.650  333.30   39.996
13  Canada    QC  YUL  tot cat          1500      100.00  1000.0  250.000  500.00   60.000