簡體   English   中英

將新列添加到 Pandas dataframe,其值來自 function

[英]Add a new column to a Pandas dataframe with a value from a function

我知道這與其他問題類似,但我找不到可以解決的問題。

我有一個 dataframe,其中包含看起來與此類似的成績:

  subj1 subj2 subj3 subj4
0   A     B     A     B
1   B     B     C     B
2   C     C     B     A

我想要 append 新列中的 GPA 分數,這樣結果是這樣的:

  subj1 subj2 subj3 subj4 GPA
0   A     B     A     B   3.5
1   B     B     C     B   2.8
2   C     D     B     A   2.5

我用來計算 GPA 的 function 是這樣的:

def calcgpa():
    for row in df.itertuples(index=False):
        tot = 0
        c = 0
        GPA = 0
        for i in range(len(row)):
            if row[i] == "A":
                tot = tot + 4
                c += 1
            elif row[i] == "B":
                tot = tot + 3
                c += 1
            elif row[i] == "C":
                tot = tot + 2
                c += 1
            elif row[i] == "D":
                tot = tot + 1
                c += 1
            else:
                c += 1
        GPA = tot / c
        return GPA

我認為df["GPA"] = pd.Series(calcgpa())會起作用,但它只會向第一行添加一個值。 所有其他的都是 NaN。 嘗試使用 pd.apply 或 pd.assign 只是給了我一個 AssertionError。

問題是 function 如何返回 GPA 還是我需要添加新列的正確語法是什么?

假設您只有 AE,如果您還有其他任何東西,請確保先將它們替換為零,然后您可以執行以下操作:

df['GPA'] = df.replace({'A':4,'B':3,'C':2, 'D':1, 'E':0}).mean(1)

df 
  subj1 subj2 subj3 subj4   GPA
0     A     B     A     B  3.50
1     B     B     C     B  2.75
2     C     C     B     A  2.75

如果您查看calcgpa()的 output,它是一個浮點數: 3.5而不是 GPA 列表,因此您的 output 只給出 1 個值,然后是 Nans。

我建議您的代碼需要將每個 GPA 值存儲到一個列表中,並將其分配為列。 這需要對您的代碼進行一些小的更改:

GPA = 0替換為GPA = []以將其轉換為列表並將其移動到 function 的頂部,在兩個 for 循環之外。 然后將GPA = tot/c更改為GPA.append(tot / c) to append 每個 GPA 到要分配為新 GPA 列的列表。

完整代碼:

def calcgpa():
    GPA = []
    for row in df.itertuples(index=False):
        tot = 0
        c = 0
        for i in range(len(row)):
            if row[i] == "A":
                tot = tot + 4
                c += 1
            elif row[i] == "B":
                tot = tot + 3
                c += 1
            elif row[i] == "C":
                tot = tot + 2
                c += 1
            elif row[i] == "D":
                tot = tot + 1
                c += 1
            else:
                c += 1
        GPA.append(tot / c)
    return GPA

然后,您可以像這樣將其分配給 GPA 列:

df["GPA"] = calcgpa()

Output:

  subj1 subj2 subj3 subj4   GPA
0     A     B     A     B  3.50
1     B     B     C     B  2.75
2     C     C     B     A  2.75

正如在另一個答案中發布的那樣,有更有效的方法可以實現這一點,但由於您的代碼很接近,我想我會修改它以實現結果

暫無
暫無

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

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