熊猫 - 计算群体规模的百分比

时间:2016-05-24 04:27:43

标签: 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      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(更好),以使col2的百分比分别为group(col1),如:

       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。

2 个答案:

答案 0 :(得分:2)

您需要使用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使用dict理解:

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

答案 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()

希望这会有所帮助。