Python 熊猫-组大小的计数百分比

Python 熊猫-组大小的计数百分比,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,比如,我有这样的数据: 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

比如,我有这样的数据:

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列分组(已按分组结果):

因此,现在我需要计算出每个子组的哪个百分比,该计数分别由2列组成整个组:

我需要再添加一列,或转换为系列(更好),以分别获得col2的百分比组(col1),如下所示:

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

让我来描述一下这些数据的含义。例如,它可以是科目(0,1,2)、结果(0或1)以及每个科目每个结果的学生人数。 因此,整个想法是要计算出0、1等科目的不及格/通过率


还有一件事-有时只有一个结果(0或1)像所有学生都通过的科目一样,我仍然需要能够判断出该科目0的百分比为0,0,1的百分比为1。

您可以尝试以下方法:

df = pd.DataFrame({'A':[0,1,0,1,0],'B':[10,5,2,16,10]}, index=[0,1,0,1,0])
df2 = df.ix[0] / df.ix[0].sum()
df3 = df.ix[1] / df.ix[1].sum()
希望这会有所帮助。

您需要通过以下第一级索引:

要存储
系列
请使用dict comprehension:

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

非常感谢您的回复。但我相信我描述的任务是错误的,让我补充更多细节并纠正错误。我道歉。请查看更新的问题。解决方案已更改,请检查。感谢您的努力。请看更新后的帖子。
df = pd.DataFrame({'A':[0,1,0,1,0],'B':[10,5,2,16,10]}, index=[0,1,0,1,0])
df2 = df.ix[0] / df.ix[0].sum()
df3 = df.ix[1] / df.ix[1].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
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