簡體   English   中英

根據其他列中的值計算值的百分比

[英]Calculating the percentage of values based on the values in other columns

我正在嘗試創建一個列,其中包含基於 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 年級和一個 3 年級。在這種情況下,給定的年級編號 1 和 2 在總年級中的百分比是 75%。 老師 2 只給了 1 個 2 年級,所以百分比是 100%。 同樣,老師 3 給出了兩個 3 級,所以百分比為 0%,因為他/她沒有給出任何 1 級和 2 級。所以這些百分比應該添加到數據集中的新列中。 老實說,我什至想不出任何可以嘗試的東西,當我在這里搜索時,我也沒有找到任何關於它的信息。 你能幫我拿到專欄嗎?

我不確定這是最有效的方法,但我發現它非常易讀且易於理解。

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

我相信這將解決您的查詢

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

我已經利用 boolean 理解來根據每個老師分離數據。 大多數代碼是不言自明的。 如需任何其他說明,請隨意填寫以發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM