所以我有一个带有两列的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的解决方案,除以总行数等。
谢谢!
答案 0 :(得分:3)
您可以将sum
与size
进行聚合,然后划分列:
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)
如果条件是1
或0
,甚至是True
或False
您可以使用mean
groupby
df.groupby('Grade').mean()
Criteria
Grade
0 1.000000
1 0.000000
2 0.666667
5 1.000000
set_index
和mean
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
以获得所需的数据帧