Pandas - 计算组大小的百分比

mim*_*mic 2 python group-by dataframe pandas

说,我有这样的数据:

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...
Run Code Online (Sandbox Code Playgroud)

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

gr = df.groupby(['col1', 'col2']).size()

col1   col2        
0      0           10
       1           5
1      0           2
       1           16
2      0           10
Run Code Online (Sandbox Code Playgroud)

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

我需要再添加一列,或转换为系列(更好)以分别具有 col2 的百分比(col1),例如:

       col1        col2
0      0           0.66
       1           0.33
1      0           0.1
       1           0.9
2      0           1
Run Code Online (Sandbox Code Playgroud)

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

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

另一件事 - 有时只有一个结果(0 或 1),就像所有学生都通过的科目一样,我仍然需要知道对于这个科目,0 的百分比是 0,0,1 的百分比是 1。

jez*_*ael 7

您需要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
Run Code Online (Sandbox Code Playgroud)

为了存储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
Run Code Online (Sandbox Code Playgroud)