Skip to main content
 首页 » 编程设计

python之Pandas之计算群体规模的百分比

2025年05月04日23shangdawei

比如说,我有这样的数据:

col1   col2 other columns.. 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      0    ... 
0      1    ... 
0      1    ... 
0      1    ... 
0      1    ... 
0      1    ... 
0      1    ... 
1      0    ... 
1      0    ... 
etc... 

数据已按 2 列分组(已按分组结果):

gr = df.groupby(['col1', 'col2']).size() 
 
col1   col2         
0      0           10 
       1           5 
1      0           2 
       1           16 
2      0           10 

所以现在我需要通过 2 列计算出每个子组的计数分别占整个组的百分比:

我需要再添加一列,或转换为 Series(更好)以分别在组(col1)中包含 col2 的百分比,例如:

       col1        col2 
0      0           0.66 
       1           0.33 
1      0           0.1 
       1           0.9 
2      0           1 

或者它可以是每个组的单独系列:[0.66 0.1 1] 和 [0.33 0.9]。 如何实现?

那么让我描述一下这个数据的含义。例如,它可以是科目 (0,1,2)、结果(0 或 1)以及每个科目每个结果的学生人数。 所以整个想法是弄清楚学生在科目 0,1 等方面失败/通过的百分比。

另外一件事 - 有时只有一个结果(0 或 1)像所有学生都通过的科目,我仍然需要能够告诉这个科目 0 的百分比是 0,0 和 1为 1。

请您参考如下方法:

你需要groupby按第一级索引 sum :

gr = df.groupby(['col1', 'col2']).size() 
print (gr) 
col1  col2 
0     0       10 
      1        5 
1     0        2 
      1       16 
2     0       10 
dtype: int64 
 
print (gr.groupby(level=0).sum()) 
col1 
0    15 
1    18 
2    10 
dtype: int64 
 
print (gr / gr.groupby(level=0).sum()) 
col1  col2 
0     0       0.666667 
      1       0.333333 
1     0       0.111111 
      1       0.888889 
2     0       1.000000 
dtype: float64 

要存储 Series 使用字典理解:

dfs = {i:g.reset_index(drop=True) for i, g in g1.groupby(level=1)} 
 
print (dfs[0]) 
0    0.666667 
1    0.111111 
2    1.000000 
dtype: float64 
 
print (dfs[1]) 
0    0.333333 
1    0.888889 
dtype: float64