熊猫-在一个列中显示值的百分比,按另一列分组

时间:2018-09-05 13:23:09

标签: python pandas percentage

所以我有一个带有两列的Pandas DataFrame: 首先是0到9的等级 第二个是Criteria,值为0或1。

等级(0-9 /条件(0/1)

   Grade  Criteria
0      0         1
1      1         0
2      2         1
3      2         0
4      5         1
5      2         1

我需要计算“标准比率”,它实际上是“标准”列中“ 1”的总和,除以“标准”列中适当的行数,但按“成绩”列值分组。 例如,对于等级= 2,我们在“条件”列中计算1的总和,然后将其除以等级2的行数:2/3,因此对于等级2,我们得到大约0.66。 在我的示例中,答案应类似于:

成绩/标准率

   Grade  Criteria
0      0  1.000000
1      1  0.000000
2      2  0.666667
3      5  1.000000

任何想法,该怎么做? 还要添加。问题-如果“条件”列中有“是/否”文本值,该怎么办? 我在这里搜索过,但只找到了groupby的解决方案,除以总行数等。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将sumsize进行聚合,然后划分列:

df = df.groupby('Grade')['Criteria'].agg(['sum','size'])
df['new'] = df['sum'] / df['size']
print (df)
       sum  size       new
Grade                     
0        1     1  1.000000
1        0     1  0.000000
2        2     3  0.666667
5        1     1  1.000000

或使用自定义功能:

#not exclude NaNs 
df = df.groupby('Grade')['Criteria'].agg(lambda x: x.sum() / len(x)).reset_index(name='new')

#exclude possible NaNs
df = df.groupby('Grade')['Criteria'].agg(lambda x: x.sum() / x.count()).reset_index(name='new')

对于使用布尔掩码的yes/no值-True类似于1 s的过程:

print (df)
   Grade Criteria
0      0      yes
1      1       no
2      2      yes
3      2       no
4      5      yes
5      2      yes

df = (df['Criteria'] == 'yes').groupby(df['Grade']).agg(lambda x: x.sum() / len(x)).reset_index(name='new')
print (df)
   Grade       new
0      0  1.000000
1      1  0.000000
2      2  0.666667
3      5  1.000000

答案 1 :(得分:1)

如果条件是10,甚至是TrueFalse

您可以使用mean

groupby

df.groupby('Grade').mean()

       Criteria
Grade          
0      1.000000
1      0.000000
2      0.666667
5      1.000000

set_indexmean

df.set_index('Grade').mean(level=0)

       Criteria
Grade          
0      1.000000
1      0.000000
2      0.666667
5      1.000000

'Criteria''yes''no'字符串的情况下

df

   Grade Criteria
0      0      yes
1      1       no
2      2      yes
3      2       no
4      5      yes
5      2      yes

您可以将布尔值评估分组

df.Criteria.eq('yes').groupby(df.Grade).mean()

Grade
0    1.000000
1    0.000000
2    0.666667
5    1.000000
Name: Criteria, dtype: float64

对这些答案中的任何一个使用reset_index以获得所需的数据帧