如何解决根据python列中的值创建百分比列
我正在尝试创建一列,其中包含基于python中其他列中的值的百分比。例如,假设我们具有以下数据集。
+------------------------------------+------------+
| teachers | grades |
+------------------------------------+------------+
| Teacher1 | 1 |
| Teacher1 | 2 |
| Teacher1 | 0 |
| Teacher2 | 1 |
| Teacher2 | 2 |
| Teacher2 | 0 |
| Teacher2 | 2 |
| Teacher3 | 2 |
| Teacher3 | 0 |
| Teacher3 | 1 |
| Teacher3 | 0 |
| Teacher4 | 0 |
| Teacher4 | 0 |
+------------------------------------+------------+
如您所见,我们在第一栏中有老师。在第二列中,我们可以看到老师给学生的分数(0,1和2)。在这里,我试图获取每个老师给定年级的1年级和2年级的百分比。例如,老师1的成绩为1年级,1年级2年和0年级。在这种情况下,给定年级数字1和2在总年级中所占的百分比为66%。所以我想得到以下数据框:
+------------------------------------+------------+------------+
| teachers | grades | percentage |
+------------------------------------+------------+------------+
| Teacher1 | 1 | 66% |
| Teacher1 | 2 | 66% |
| Teacher1 | 0 | 66% |
| Teacher2 | 1 | 75% |
| Teacher2 | 2 | 75% |
| Teacher2 | 0 | 75% |
| Teacher2 | 2 | 75% |
| Teacher3 | 2 | 50% |
| Teacher3 | 0 | 50% |
| Teacher3 | 1 | 50% |
| Teacher3 | 0 | 50% |
| Teacher4 | 0 | 0% |
| Teacher4 | 0 | 0% |
+------------------------------------+------------+------------+
到目前为止,我已经尝试了以下方法,但是没有用。你能帮我吗?
percents = {} #store Teacher:percent
for t,g in df.groupby('teachers'):
total = g.grades.sum()
one_two = g.loc[g.grades.isin([1,2])].counts.sum() #consider only 1&2
percent = (one_two/total)*100
print(t,percent)
percents[t] = [percent]
解决方法
使用numpy / pandas时请避免循环。这是它的向量化版本:
percentage = df.groupby('teachers').grades.transform(lambda x: sum(x > 0) / len(x))
这里唯一的区别是.transform
,它具有处理组的功能-您已经拥有其他所有内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。