如何使用熊猫从所选行的总和中获取百分比?



我需要从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)。 在我需要将"总计百分比"列添加到DF之后,该列将显示每个给定名称总计中每行值的百分比。"占总数的百分比"列中的每个"名称组"(名称 1、名称 2...)将具有自己的 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 

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

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

试试这个:

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

最新更新