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。
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)