根据其他列中的值计算值的百分比

时间:2020-08-21 05:33:38

标签: python

我正在尝试创建一列,其中包含基于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年级的任何分数。因此,这些百分比应添加到数据集中的新列中。老实说,我什至没有想尝试的任何东西,在这里搜索时也找不到任何东西。您能帮我获得专栏吗?

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

我利用布尔值理解来分离数据 根据每个老师。大部分代码是不言自明的。对于任何 其他说明,请填写以发表评论。