我正在尝试创建一列,其中包含基于python中其他列中的值的百分比值。例如,假设我们具有以下数据集。
+------------------------------------+------------+--------+
| Teacher | grades | counts |
+------------------------------------+------------+--------+
| Teacher1 | 1 | 1 |
| | 2 | 2 |
| | 3 | 1 |
| Teacher2 | 2 | 1 |
| Teacher3 | 3 | 2 |
| Teacher4 | 2 | 2 |
| | 3 | 2 |
+------------------------------------+------------+--------+
如您所见,我们在第一列中有老师,在第二列中有老师给的分数(1,2和3),在第三列中有给定的相应分数的数量。在这里,我试图获取每个老师给定年级的1年级和2年级的百分比。例如,老师1的成绩为1年级,2年级的2年和1年级的3。在这种情况下,给定年级数字1和2在总年级中所占的百分比为75%。老师2只给1个2年级,所以百分比是100%。同样,老师3的成绩为2年级3,所以百分比为0%,因为他/她没有给出1年级和2年级的任何分数。因此,这些百分比应添加到数据集中的新列中。老实说,我什至没有想尝试的任何东西,在这里搜索时也找不到任何东西。您能帮我获得专栏吗?
答案 0 :(得分:1)
我不确定这是否是最有效的方法,但是我发现它非常易读且易于遵循。
percents = {} #store Teacher:percent
for t, g in df.groupby('Teacher'): #t,g is short for teacher,group
total = g.counts.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]
xf = pd.DataFrame(percents).T.reset_index() #make a df from the dic
xf.columns = ['Teacher','percent'] #rename columns
df = df.merge(xf) #merge with initial df
print(df)
Teacher grades counts percent
0 Teacher1 1 1 75.0
1 Teacher1 2 2 75.0
2 Teacher1 3 1 75.0
3 Teacher2 2 1 100.0
4 Teacher3 3 2 0.0
5 Teacher4 2 2 50.0
6 Teacher4 3 2 50.0
答案 1 :(得分:-1)
我相信这会解决您的查询
y=0
data['Percentage']='None'
for teacher in teachers:
x=data[data['Teachers']==teacher]
total=sum(x['Counts'])
condition1= 1 in set(x['Grades'])
condition2= 2 in set(x['Grades'])
if (condition1==True or condition2==True):
for i in range(y,y+len(x)):
data['Percentage'].iloc[i]=(data['Counts'].iloc[i]/total)*100
else:
for i in range(y,y+len(x)):
data['Percentage'].iloc[i]=0
y=y+len(x)
Output:
Teachers Grades Counts Percentage
0 Teacher1 1 1 25
1 Teacher1 2 2 50
2 Teacher1 3 1 25
3 Teacher2 2 1 100
4 Teacher3 3 2 0
5 Teacher4 2 2 50
6 Teacher4 3 2 50
我利用布尔值理解来分离数据 根据每个老师。大部分代码是不言自明的。对于任何 其他说明,请填写以发表评论。