【问题标题】:How to get percentage from sum of selected rows using Pandas? [duplicate]如何使用 Pandas 从选定行的总和中获取百分比? [复制]
【发布时间】:2019-09-13 00:15:29
【问题描述】:

我需要从 DF 中选定的行组中获取值的总和,然后计算组中每一行的百分比。

df = pd.read_csv("file.csv")

names = df.groupby(["Names", "Action"]).size().reset_index(name='counts')

names.rename(columns={"counts":"Count"}, inplace=True)

像这样获取 DF:

  Name    Action     Count
0  Name1  Action 1      7
1  Name1  Action 2      3
2  Name1  Action 3    720
3  Name1  Action 4     95
4  Name1  Action 5    301
5  Name1  Action 6      1
6  Name2  Action 1     17
7  Name2  Action 2      1
8  Name3  Action 1      1
9  Name3  Action 2     23
10 Name3  Action 3    170

对于每个名称,我有不同的操作和相应的数字。我需要计算每个名称的所有类型操作的总数(对于 Name1,我们将是 1127)。 在我需要将列“% of Total”添加到 DF 之后,它将显示每个给定名称的总计中每行值的百分比。 “% of Total”列中的每个“名称组”(Name1、Name2...)行都有自己的 100 % 百分比。
它应该是这样的:

  Name    Action     Count  % of Total
0  Name1  Action 1      7    0.62
1  Name1  Action 2      3    0.27
2  Name1  Action 3    720    63.89
3  Name1  Action 4     95    8.43
4  Name1  Action 5    301    26.71
5  Name1  Action 6      1    0.09
6  Name2  Action 1     17    94.44
7  Name2  Action 2      1    5.56
8  Name3  Action 1      1    0.52
9  Name3  Action 2     23    11.86
10 Name3  Action 3    170    87.63

为了获得每个名称的所有“动作”值的总和,我创建了一个新的 DF:

df_total = df.groupby(["Name"]).size().reset_index(name='counts_new')

Df 看起来像这样:

  Name  counts_new
0 Name1   1127
1 Name2   18
2 Name3   194
3 Name4   1377
4 Name5   93
5 Name6   1627
6 Name7   1355
7 etc... 

现在我的计划是通过一些计算将列添加到 Df。 但是我不明白如何编写代码:Name1 的每一行都将从 df_total 计算相应的行(Name1)。

当我得到这个(我明白这是不对的)时,它只从 DF 中获取第一行并使用 df_total 中的第一行执行计算,然后是第二、第三。这会得到所有错误的结果。

names["% of Total"] = df["Count"] * 100 / df_total["counts_new"]

   Name  Action    Count    % of Total
0 Name1  Action 1     7     0.621118
1 Name1  Action 2     3     16.666667
2 Name1  Action 3    720    371.134021
3 Name1  Action 4     95    6.899056
4 Name1  Action 5    301    323.655914
5 Name1  Action 6     1     0.061463
6 Name2  Action 1     17    1.254613
7 Name2  Action 2     1     0.125945 

将不胜感激任何帮助。 谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,使用transform

    df['pctg'] = df.Count / df.groupby(['Name']).Count.transform('sum') * 100
    

    输出

        Name    Action      Count   pctg
    0   Name1   Action 1    7       0.621118
    1   Name1   Action 2    3       0.266193
    2   Name1   Action 3    720     63.886424
    3   Name1   Action 4    95      8.429459
    4   Name1   Action 5    301     26.708075
    5   Name1   Action 6    1       0.088731
    6   Name2   Action 1    17      94.444444
    7   Name2   Action 2    1       5.555556
    8   Name3   Action 1    1       0.515464
    9   Name3   Action 2    23      11.855670
    10  Name3   Action 3    170     87.628866
    

    【讨论】:

      【解决方案2】:

      试试这个:

      df['% of Total'] = (df['Count'] / df.groupby('Name')['Count'].transform('sum') * 100).round(2)
      

      输出:

           Name    Action  Count  % of Total
      0   Name1  Action 1      7        0.62
      1   Name1  Action 2      3        0.27
      2   Name1  Action 3    720       63.89
      3   Name1  Action 4     95        8.43
      4   Name1  Action 5    301       26.71
      5   Name1  Action 6      1        0.09
      6   Name2  Action 1     17       94.44
      7   Name2  Action 2      1        5.56
      8   Name3  Action 1      1        0.52
      9   Name3  Action 2     23       11.86
      10  Name3  Action 3    170       87.63
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多